PHP的中使用非缓冲模式查询数据库的方法


Posted in PHP onFebruary 05, 2017

最近在开发一个PHP程序时遇到了下面的错误:

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

错误信息显示允许的最大内存已经耗尽。遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。

毕竟编程这么多年,我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存。

另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。

非缓冲查询方法一: 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;
  }
}

注:引之 http://www.webhek.com/php-buffered-and-unbuffered-queries

手册资料 http://php.net/manual/zh/mysqlinfo.concepts.buffering.php

PHP 相关文章推荐
最新的php 文件上传模型,支持多文件上传
Aug 13 PHP
php explode函数实例代码
Feb 27 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 PHP
深入php常用函数的使用汇总
Jun 08 PHP
PHP转换IP地址到真实地址的方法详解
Jun 09 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
一个PHP的远程图片抓取函数分享
Sep 25 PHP
PHP输出一个等腰三角形的方法
May 12 PHP
PHP数组操作简单案例分析
Oct 15 PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
Nov 10 PHP
php+redis在实际项目中HTTP 500: Internal Server Error故障排除
Feb 05 #PHP
php实现给二维数组中所有一维数组添加值的方法
Feb 04 #PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 #PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 #PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
Feb 04 #PHP
PHP正则表达式匹配替换与分割功能实例浅析
Feb 04 #PHP
/etc/php-fpm.d/www.conf 配置注意事项
Feb 04 #PHP
You might like
smarty简单分页的实现方法
2014/10/27 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
浅谈PHP的反射API
2017/02/26 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
JavaScript 给汉字排序实例代码
2008/06/28 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
jQuery判断div随滚动条滚动到一定位置后停止
2014/04/02 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
vue实现图片上传功能
2020/05/28 Javascript
python线程锁(thread)学习示例
2013/12/04 Python
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
python使用点操作符访问字典(dict)数据的方法
2015/03/16 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
面向对象编程是如何提高软件开发水平的
2014/05/06 面试题
Shell编程面试题
2016/05/29 面试题
股份合作协议书
2014/09/10 职场文书
投标售后服务承诺书
2015/04/29 职场文书
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers