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 相关文章推荐
用session做客户验证时的注意事项
Oct 09 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
详解WordPress开发中wp_title()函数的用法
Jan 07 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
PHP实现文件上传操作和封装
Mar 04 PHP
通过实例解析PHP数据类型转换方法
Jul 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 删除cookie和浏览器重定向
2009/03/16 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
父窗口获取弹出子窗口文本框的值
2006/06/27 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
完美实现js选项卡切换效果(二)
2017/03/08 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
基于jquery trigger函数无法触发a标签的两种解决方法
2018/01/06 jQuery
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python如何重载模块实例解析
2018/01/25 Python
python检测IP地址变化并触发事件
2018/12/26 Python
Python3常用内置方法代码实例
2019/11/18 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
COS美国官网:知名服装品牌
2019/04/08 全球购物
公积金转移接收函
2014/01/11 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
优秀大学生自荐信
2015/03/26 职场文书
感恩老师主题班会
2015/08/12 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js