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中定义网站根目录的常用方法
Aug 08 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
php数组查找函数总结
Nov 18 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
php将12小时制转换成24小时制的方法
Mar 31 PHP
PHP网络操作函数汇总
May 18 PHP
php去掉文件前几行的方法
Jul 29 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
php微信公众号开发之翻页查询
Oct 20 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 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获取URL中带#号等特殊符号参数的解决方法
2014/09/02 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
python处理xml文件的方法小结
2017/05/02 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python3实现获取图片文字里中文的方法分析
2018/12/13 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
python实现微信自动回复机器人功能
2019/07/11 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python实现超市商品销售管理系统
2019/11/22 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
用纯css3实现的图片放大镜特效效果非常不错
2014/09/02 HTML / CSS
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
大学生个人简历中的自我评价
2013/12/27 职场文书
化学实验员岗位职责
2013/12/28 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
拾金不昧的表扬信
2014/01/16 职场文书
医务人员自我评价
2014/01/26 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
创新比赛获奖感言
2014/02/13 职场文书
预备党员表决心书
2014/03/11 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
深入浅析Django MTV模式
2021/09/04 Python
Python开发简易五子棋小游戏
2022/05/02 Python