PHP脚本内存泄漏直到最终溢出

时间:2013-02-11 21:34:07

标签: php memory

使用PHP脚本继续遇到一个奇怪的问题。该脚本的想法是从MySQL表中获取一堆数据,处理它,比较来自另一个表的一些数据,并将结果打印成CSV格式的文件。

此脚本将运行数十万次迭代才能完成。我遇到的问题是即使在数组上使用unset()和在我的MySQL查询上使用free(),内存仍然会被使用,直到大约350,000左右,内存耗尽。

没有失败,每次我运行脚本时,memory_get_usage()报告的内存分配保持不变,直到大约1050次迭代。然后它将增加262,144字节。通过测试,它也总是在脚本中完全相同的位置递增。在下面的代码块中,它总是在b2a的一次迭代中递增(最多4次可能的迭代)。

//up here we get the data to run analysis/comparisons on.

echo "{$lineCounter}b:  " . memory_get_usage(TRUE) . "\n"; //27525120
if ($AttResults = $db_cx->query($ObsAttQuery)) {
   echo "{$lineCounter}b1:  " . memory_get_usage(TRUE) . "\n"; //27525120
   $attArray = array();
   echo "{$lineCounter}b2: " . memory_get_usage(TRUE) . "\n"; //27525120
   while ($attRow = $AttResults->fetch_object()) {
      echo "{$lineCounter}b2a {$attRow->attId}: " . memory_get_usage(TRUE) . "\n"; //27787264
      $attArray[$attRow->attId] = $attRow->value;
   }
echo "{$lineCounter}b3: " . memory_get_usage(TRUE) . "\n"; //27787264
$AttResults->free();
if (empty($attArray)) continue;

//down here after it is done I have an unset on the $attArray variable

有关要尝试的事情的任何建议吗?

2 个答案:

答案 0 :(得分:0)

在版本5.3之前,php有一个非常愚蠢的垃圾收集器:Memory Leaks With Objects in PHP 5。有了这个,你甚至无法用unset()释放你的记忆。你必须在取消设置之前打破循环引用,或者至少使用php 5.3。

答案 1 :(得分:0)

您是否查看了检索到的数据:

$attRow = $AttResults->fetch_object()

迭代1050之前/之后?

...而且......是的,我会在while中更改赋值,在循环之前进行一次提取,在结束之前进行一次提取以查看内存是否发生变化。