全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

最近在开发一个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中数据库单例模式的实现代码分享  # php设计模式 DAO(数据访问对象模式)  # 浅析php设计模式之数据对象映射模式  # PHP基于单例模式实现的数据库操作基类  # PHP实现的数据对象映射模式详解  # PHP单例模式应用示例【多次连接数据库只实例化一次】  # PHP单例模式数据库连接类与页面静态化实现方法  # PHP数据对象映射模式实例分析  # PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析  # PHP数据源架构模式之表入口模式实例分析  # 的是  # 也就是说  # 加载  # 也不  # 我很  # 要把  # 给了  # 要用  # 但却  # 更重要  # 官方网  # 站上  # 流媒体  # 较少  # 错误信息  # 可想而知  # 才怪  # 而不是  # 增加了  # 行数 


相关文章: 外贸公司网站制作,外贸网站建设一般有哪些步骤?  如何快速重置建站主机并恢复默认配置?  如何在阿里云购买域名并搭建网站?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  成都响应式网站开发,dw怎么把手机适应页面变成网页?  高端建站三要素:定制模板、企业官网与响应式设计优化  如何在VPS电脑上快速搭建网站?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?  网站制作企业,网站的banner和导航栏是指什么?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何高效完成独享虚拟主机建站?  如何打造高效商业网站?建站目的决定转化率  如何在西部数码注册域名并快速搭建网站?  制作农业网站的软件,比较好的农业网站推荐一下?  如何高效完成自助建站业务培训?  c# 在高并发下使用反射发射(Reflection.Emit)的性能  如何在Windows虚拟主机上快速搭建网站?  大连网站设计制作招聘信息,大连投诉网站有哪些?  python的本地网站制作,如何创建本地站点?  广德云建站网站建设方案与建站流程优化指南  北京建设网站制作公司,北京古代建筑博物馆预约官网?  实例解析Array和String方法  专业网站建设制作报价,网页设计制作要考什么证?  表情包在线制作网站免费,表情包怎么弄?  建站之星CMS五站合一模板配置与SEO优化指南  建站VPS推荐:2025年高性能服务器配置指南  制作电商网页,电商供应链怎么做?  孙琪峥织梦建站教程如何优化数据库安全?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站之星如何取消后台验证码生成?  定制建站流程解析:需求评估与SEO优化功能开发指南  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  再谈Python中的字符串与字符编码(推荐)  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  如何通过VPS搭建网站快速盈利?  视频网站制作教程,怎么样制作优酷网的小视频?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  免费视频制作网站,更新又快又好的免费电影网站?  建站主机系统SEO优化与智能配置核心关键词操作指南  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何选择香港主机高效搭建外贸独立站?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何用搬瓦工VPS快速搭建个人网站?  济南网站制作的价格,历城一职专官方网站?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  韩国服务器如何优化跨境访问实现高效连接?  想学网站制作怎么学,建立一个网站要花费多少?  制作网站公司那家好,网络公司是做什么的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。