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 和 HTML
Oct 09 PHP
实用函数9
Nov 08 PHP
php扩展ZF――Validate扩展
Jan 10 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
PHP面向对象概念
Nov 06 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
Jul 25 PHP
详解PHP导入导出CSV文件
Nov 03 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
PHP 模拟登陆功能实例详解
Sep 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
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
php获取url参数方法总结
2014/11/13 PHP
js代码实现微博导航栏
2015/07/30 PHP
phpwind放自动注册方法
2006/12/02 Javascript
JavaScript与函数式编程解释
2007/04/27 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
iframe实用操作锦集
2014/04/22 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
js实现rem自动匹配计算font-size的示例
2017/11/18 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
详解如何使用React Hooks请求数据并渲染
2020/10/18 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
python SVD压缩图像的实现代码
2019/11/05 Python
pandas中ix的使用详细讲解
2020/03/09 Python
Python 内存管理机制全面分析
2021/01/16 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
Ticketmaster德国票务网站:购买音乐会和体育等门票
2016/11/14 全球购物
为什么group by 和order by会使查询变慢
2014/05/16 面试题
幼儿教师师德承诺书
2014/05/23 职场文书
golang import自定义包方式
2021/04/29 Golang