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 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
php_xmlhttp 乱码问题解决方法
Aug 07 PHP
探讨方法的重写(覆载)详解
Jun 08 PHP
php session的锁和并发
Jan 22 PHP
php模板引擎技术简单实现
Mar 15 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
PHP实现对二维数组某个键排序的方法
Sep 14 PHP
php 数组元素快速去重
May 05 PHP
PHP hex2bin()函数用法讲解
Feb 25 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 PHP
PHP实现创建以太坊钱包转账等功能
Apr 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
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
异步动态加载js与css文件的js代码
2013/09/15 Javascript
javascript类型转换使用方法
2014/02/08 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
JS选项卡动态替换banner图片路径的方法
2015/05/11 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
原生JS实现获取及修改CSS样式的方法
2018/09/04 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
JS实现密码框效果
2020/09/10 Javascript
Python word文本自动化操作实现方法解析
2020/11/05 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
俄罗斯三星品牌商店:Samsungstore
2020/04/05 全球购物
学生实习推荐信范文
2013/11/26 职场文书
捐款倡议书
2014/04/14 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
2014年医生工作总结
2014/11/21 职场文书
教师先进个人材料
2014/12/17 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
Django drf请求模块源码解析
2021/06/08 Python
Python道路车道线检测的实现
2021/06/27 Python
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python
SQL Server实现分页方法介绍
2022/03/16 SQL Server
如何利用python实现Simhash算法
2022/06/28 Python