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 相关文章推荐
在普通HTTP上安全地传输密码
Jul 21 PHP
php Smarty date_format [格式化时间日期]
Mar 15 PHP
php加密解密实用类分享
Jan 07 PHP
smarty缓存用法分析
Dec 16 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
刷新PHP缓冲区为你的站点加速
Oct 10 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
解析 thinkphp 框架中的部分方法
May 07 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
Aug 28 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
ThinkPHP框架下微信支付功能总结踩坑笔记
Apr 10 PHP
Laravel框架之解决前端显示图片问题
Oct 24 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
超外差式晶体管收音机的组装与统调
2021/03/01 无线电
实用函数8
2007/11/08 PHP
解析php入库和出库
2013/06/25 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
jquery实现图片上传之前预览的方法
2015/07/11 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
Python简单计算给定某一年的某一天是星期几示例
2018/06/27 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
自我评价中英文语句
2013/11/30 职场文书
新郎新娘婚礼答谢词
2014/01/11 职场文书
安全大检查反思材料
2014/01/31 职场文书
商场促销活动方案
2014/02/08 职场文书
网上祭先烈心得体会
2014/09/01 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
创业计划书之服装
2019/10/07 职场文书