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安全配置方法
Jun 16 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
浅析php中抽象类和接口的概念以及区别
Jun 27 PHP
php采用file_get_contents代替使用curl实例
Nov 07 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
PHP实现微信发红包程序
Aug 24 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
通过源码解析Laravel的依赖注入
Jan 22 PHP
PHP设计模式之模板方法模式定义与用法详解
Apr 02 PHP
PHP中的自动加载操作实现方法详解
Aug 06 PHP
详解php反序列化
Jun 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生成rss类用法实例
2015/04/14 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
jQuery Validation插件remote验证方式的Bug解决
2010/07/01 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
jQuery实现鼠标悬停显示提示信息窗口的方法
2015/04/30 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
2017/05/17 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
layui 表单标签的校验方法
2019/09/04 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python多继承顺序实例分析
2018/05/26 Python
Python标准库shutil用法实例详解
2018/08/13 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
Python 从attribute到property详解
2020/03/05 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
南非最受欢迎的时尚品牌:MRP
2016/09/18 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
英国大码女性时装零售商:Evans
2018/08/29 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
加拿大专业美发产品购物网站:Chatters
2021/02/28 全球购物
经管应届生求职信范文
2014/05/18 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
新学期开学标语2015
2015/07/16 职场文书
python中%格式表达式实例用法
2021/06/18 Python