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

Lou*_*sak 5 php mysql memory-leaks

当我对大约 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];
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)
Run Code Online (Sandbox Code Playgroud)

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

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

goa*_*oat 2

mysql_query将整个结果集缓冲到 php 内存中。这很方便并且通常非常快,但是您遇到了它的缺点。

mysql_unbuffered_query () 存在。它不会一次获取整个结果集。当您从结果集中获取行时,它会一次抓取一小部分。