PHP的中使用非缓冲模式查询数据库的方法


Posted in PHP onFebruary 05, 2017

最近在开发一个PHP程序时遇到了下面的错误:

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

错误信息显示允许的最大内存已经耗尽。遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。

毕竟编程这么多年,我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存。

另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。

非缓冲查询方法一: mysqli

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);
 
if ($uresult) {
  while ($row = $uresult->fetch_assoc()) {
    echo $row['Name'] . PHP_EOL;
  }
}
$uresult->close();

非缓冲查询方法二: pdo_mysql

<?php
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass');
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
 
$uresult = $pdo->query("SELECT Name FROM City");
if ($uresult) {
  while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {
    echo $row['Name'] . PHP_EOL;
  }
}

非缓冲查询方法三: mysql

<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db  = mysql_select_db("world");
 
$uresult = mysql_unbuffered_query("SELECT Name FROM City");
if ($uresult) {
  while ($row = mysql_fetch_assoc($uresult)) {
    echo $row['Name'] . PHP_EOL;
  }
}

注:引之 http://www.webhek.com/php-buffered-and-unbuffered-queries

手册资料 http://php.net/manual/zh/mysqlinfo.concepts.buffering.php

PHP 相关文章推荐
让你的网站首页自动选择语言转跳
Dec 06 PHP
php下几个常用的去空、分组、调试数组函数
Feb 22 PHP
PHP 读取文件的正确方法
Apr 29 PHP
php 截取字符串并以零补齐str_pad() 函数
May 07 PHP
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
使用 PHPMAILER 发送邮件实例应用
Nov 07 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
Jun 20 PHP
PHP自带函数给数字或字符串自动补齐位数
Jul 29 PHP
php中关于socket的系列函数总结
May 18 PHP
PHP通过微信跳转的Code参数获取用户的openid(关键代码)
Jul 06 PHP
PHP设计模式之注册树模式分析
Jan 26 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 #PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 #PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 #PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 #PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
Feb 04 #PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 #PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 #PHP
You might like
php实现jQuery扩展函数
2009/10/30 PHP
php empty函数判断mysql表单是否为空
2010/04/12 PHP
php中JSON的使用方法
2015/04/30 PHP
使用PHP uniqid函数生成唯一ID
2015/11/18 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
Javascript里使用Dom操作Xml
2006/09/20 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
Angular 输入框实现自定义验证功能
2017/02/19 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[56:42]VP vs RNG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
win7上python2.7连接mysql数据库的方法
2017/01/14 Python
对python中Librosa的mfcc步骤详解
2019/01/09 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
Python面向对象思想与应用入门教程【类与对象】
2019/04/12 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
娇韵诗Clarins意大利官方网站:法国天然护肤品牌
2020/03/11 全球购物
会计学应届毕业生推荐信
2013/11/04 职场文书
高中毕业生个人自我鉴定
2013/11/24 职场文书
申报职称专业技术个人的自我评价
2013/12/12 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
幼儿园户外活动总结
2014/07/04 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
导游词之山东孔庙
2019/11/04 职场文书
python中redis包操作数据库的教程
2022/04/19 Python
Python 避免字典和元组的多重嵌套问题
2022/07/15 Python