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
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
php变量范围介绍
Oct 15 PHP
php实现执行某一操作时弹出确认、取消对话框
Dec 30 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
yii操作session实例简介
Jul 31 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
Dec 09 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
Oct 03 PHP
php7连接MySQL实现简易查询程序的方法
Oct 13 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 Mysql类 可以参考学习熟悉下
2009/06/21 PHP
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
基于PHP输出缓存(output_buffering)的深入理解
2013/06/13 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
PHP使用PDO实现mysql防注入功能详解
2019/12/20 PHP
js异或加解密效果代码
2008/06/25 Javascript
Jquery Select操作方法集合脚本之家特别版
2010/05/17 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
简述vue中的config配置
2018/01/23 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
Python3写入文件常用方法实例分析
2015/05/22 Python
Python探索之爬取电商售卖信息代码示例
2017/10/27 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
python3 logging日志封装实例
2020/04/08 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
J2EE面试题大全
2016/08/06 面试题
学校门卫岗位职责
2014/03/16 职场文书
小学毕业寄语大全
2014/04/03 职场文书
市场营销调查计划书
2014/05/02 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
电子商务系毕业生自荐信
2014/05/29 职场文书
计算机求职信
2014/07/02 职场文书
接收函
2019/04/22 职场文书
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL