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开源开发框架ZendFramework使用中常见问题说明及解决方案
Jun 12 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
php实现mysql事务处理的方法
Dec 25 PHP
php使用parse_url和parse_str解析URL
Feb 22 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 PHP
Yii调试查看执行SQL语句的方法
Jul 15 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
PHP实现的字符串匹配算法示例【sunday算法】
Dec 19 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
在Laravel 的 Blade 模版中实现定义变量
Oct 14 PHP
PHP7 标准库修改
Mar 09 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
初品cakephp 入门基础
2012/02/16 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
JavaScript脚本性能优化注意事项
2008/11/18 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
Javascript中的async awai的用法
2017/05/17 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
使用IPython下的Net-SNMP来管理类UNIX系统的教程
2015/04/15 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
python输入整条数据分割存入数组的方法
2018/11/13 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
接口可以包含哪些成员
2012/09/30 面试题
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
项目合作计划书
2014/01/09 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
群众路线表态发言材料
2014/10/17 职场文书
个人存款证明书
2014/10/18 职场文书