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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
May 15 PHP
php上传图片到指定位置路径保存到数据库的具体实现
Dec 30 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 PHP
php中fgetcsv()函数用法实例
Nov 28 PHP
PHP随机生成唯一HASH值自定义函数
Apr 20 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
PHP调试的强悍利器之PHPDBG
Feb 22 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
Symfony2针对输入时间进行查询的方法分析
Jun 28 PHP
PHP 模拟登陆功能实例详解
Sep 10 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 引用是个坏习惯
2010/03/12 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
jQuery UI 应用不同Theme的办法
2010/09/12 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
js实现缓冲运动效果的方法
2015/04/10 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
BootStrap中
2016/12/10 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
JS异步错误捕获的一些事小结
2019/04/26 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
[02:44]重置世界,颠覆未来——DOTA2 7.23版本震撼上线
2019/12/01 DOTA
对Python中gensim库word2vec的使用详解
2018/05/08 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
澳大利亚家具和家居用品购物网站:Zanui
2018/12/29 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
馥蕾诗美国官网:Fresh美国
2019/10/09 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
企业挂职心得体会
2014/09/10 职场文书
2015年度质量工作总结报告
2015/04/27 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis