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中遍历stdclass object的实现代码
Jun 09 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
PHP如何利用P3P实现跨域
Aug 24 PHP
php面向对象中static静态属性与方法的内存位置分析
Feb 08 PHP
开启PHP Static 关键字之旅模式
Nov 13 PHP
微信红包随机生成算法php版
Jul 21 PHP
golang与php实现计算两个经纬度之间距离的方法
Jul 22 PHP
PHP实现图片压缩
Sep 09 PHP
PHP实现的杨辉三角求解算法分析
Mar 11 PHP
在laravel中使用with实现动态添加where条件
Oct 10 PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 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/01/26 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
2016/06/12 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
JS判断鼠标进入容器的方向与window.open新窗口被拦截的问题
2016/12/23 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
Python中列表的一些基本操作知识汇总
2015/05/20 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
keras 多gpu并行运行案例
2020/06/10 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
python空元组在all中返回结果详解
2020/12/15 Python
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
保险专业大专生求职信
2013/10/26 职场文书
总监职责范文
2013/11/09 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
工程款申请报告
2015/05/15 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript