从MySQL获取大型数据集时PHP中的内存泄漏

当我为大约60,000条记录的用户表执行以下代码时:

MysqL_connect("localhost", "root", "");
MysqL_select_db("test");

$result = MysqL_query("select * from users");

while ($row = MysqL_fetch_object($result)) {
  echo(convert(memory_get_usage(true))."\n");
}


function convert($size) {
  $unit=array('b','kb','mb','gb','tb','pb');
  return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

我收到以下错误

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)

关于如何避免让脚本在每次循环中占用额外内存的任何想法?在我的实际代码中,我正在尝试为大型数据集提供CSV下载,并进行一些PHP预处理.

请不要建议增加PHP的内存限制 – 这是一个坏主意,更重要的是,仍然会创建一个向上限制使用此技术处理数据集的大小.

解决方法:

mysql_query将整个结果集缓存到PHP内存中.这很方便,而且通常非常快,但是你遇到了一个缺点.

mysql_unbuffered_query()存在.它不会一次性获取整个结果集.当您从结果集中获取行时,它会抓取一些小块.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...