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 相关文章推荐
php上传、管理照片示例
Oct 09 PHP
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
Apr 07 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
Jan 10 PHP
php class中self,parent,this的区别以及实例介绍
Apr 24 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
php中用date函数获取当前时间有误的解决办法
Aug 02 PHP
浅析php中json_encode()和json_decode()
May 25 PHP
PHP实现服务器状态监控的方法
Dec 09 PHP
8个PHP程序员常用的功能汇总
Dec 18 PHP
php cookie 详解使用实例
Nov 03 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 PHP
PHP __call()方法实现委托示例
May 20 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
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
PHP 第二节 数据类型之字符串类型
2012/04/28 PHP
php生成随机数的三种方法
2014/09/10 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
Angularjs 依赖压缩及自定义过滤器写法
2017/02/04 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
Python编写一个闹钟功能
2017/07/11 Python
浅谈Python 函数式编程
2020/06/20 Python
flask框架中的cookie和session使用
2021/01/31 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
2021/02/24 Python
python在协程中增加任务实例操作
2021/02/28 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
Python如何定义一个函数
2015/09/01 面试题
简单的大学生自我鉴定
2014/02/18 职场文书
消防安全员岗位职责
2014/03/10 职场文书
寄语是什么意思
2014/04/10 职场文书
投标授权委托书范文
2014/08/02 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
爱国主义影片观后感
2015/06/18 职场文书
Python源码解析之List
2021/05/21 Python