PHP查询大量数据内存耗尽问题的解决方法


Posted in PHP onOctober 28, 2016

从数据库查询大量数据时会出现内容不够的提示

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

这个问题在PHP的官方网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。

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

很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。

对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。

 非缓冲查询方法一: 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; 
  } 
} 
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php代码优化及php相关问题总结
Oct 09 PHP
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
用PHP连接Oracle for NT 远程数据库
Oct 09 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
PHP程序级守护进程的实现与优化的使用概述
May 02 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
php简单随机字符串生成方法示例
Apr 19 PHP
全面解析PHP面向对象的三大特征
Jun 10 PHP
swoole_process实现进程池的方法示例
Oct 29 PHP
thinkphp5框架API token身份验证功能示例
May 21 PHP
php更新cookie内容的详细方法
Sep 30 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 #PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
Oct 28 #PHP
PHP图像识别技术原理与实现
Oct 27 #PHP
PHP对称加密函数实现数据的加密解密
Oct 27 #PHP
PHP下的浮点运算不准的解决方法
Oct 27 #PHP
php函数mkdir实现递归创建层级目录
Oct 27 #PHP
PHP实现递归目录的5种方法
Oct 27 #PHP
You might like
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
2017/08/01 PHP
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
JavaScript中实现块作用域的方法
2010/04/01 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
python使用turtle绘制分形树
2018/06/22 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
python实现统计代码行数的小工具
2019/09/19 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
基于 HTML5 WebGL 实现的医疗物流系统
2019/10/08 HTML / CSS
美国折衷生活方式品牌:Robert Graham
2018/07/13 全球购物
对于没有初始化的变量的初始值可以作怎样的假定
2014/10/12 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
2014年实验室工作总结
2014/12/03 职场文书
2015年端午节国旗下演讲稿
2015/03/19 职场文书
毕业实习单位意见
2015/06/04 职场文书
职位证明模板
2015/06/23 职场文书
详解如何使用Node.js实现热重载页面
2021/05/06 Javascript