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中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
Mar 29 PHP
php遍历数组的方法分享
Mar 22 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
浅析php创建者模式
Nov 25 PHP
smarty缓存用法分析
Dec 16 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 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
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
php最简单的删除目录与文件实现方法
2014/11/28 PHP
深入浅析用PHP实现MVC
2016/03/02 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
jQuery 操作XML入门
2008/12/25 Javascript
Mootools 1.2教程 函数
2009/09/15 Javascript
jquery.validate使用攻略 第一部
2010/07/01 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
python 读写txt文件 json文件的实现方法
2016/10/22 Python
python实现微信自动回复功能
2018/04/11 Python
python中yield的用法详解——最简单,最清晰的解释
2019/04/04 Python
Python下使用Trackbar实现绘图板
2020/10/27 Python
python的setattr函数实例用法
2020/12/16 Python
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
詹天佑教学反思
2014/04/30 职场文书
高中运动会广播稿
2014/09/16 职场文书
关于感谢信的范文
2015/01/23 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
工作一年自我鉴定
2019/06/20 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫