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自动生成月历代码
Oct 09 PHP
php网页后退不再出现过期
Mar 08 PHP
php网站来路获取代码(针对搜索引擎)
Jun 08 PHP
用php解析html的实现代码
Aug 08 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
使用php实现快钱支付功能(涉及到接口)
Jul 01 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
Apr 09 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
PHP通过串口实现发送短信
Jul 08 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
PHP使用Redis替代文件存储Session的方法
Feb 15 PHP
php查询内存信息操作示例
May 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
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
memcache命令启动参数中文解释
2014/01/13 PHP
PHP中4种常用的抓取网络数据方法
2015/06/04 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
PHP执行linux命令6个函数代码实例
2020/11/24 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
THREE.JS入门教程(3)着色器-下
2013/01/24 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
用svg制作富有动态的tooltip
2015/07/17 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
python实现得到一个给定类的虚函数
2014/09/28 Python
python实现FTP服务器服务的方法
2017/04/11 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
python2.7实现爬虫网页数据
2018/05/25 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
python过滤中英文标点符号的实例代码
2019/07/15 Python
用Python写一个自动木马程序
2019/09/17 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
旅游管理专业个人求职信范文
2013/12/24 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android