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


PHP Script Memory Leaking Until Eventual Overflow

用PHP脚本不断遇到一个奇怪的问题。该脚本的想法是从MySQL表中获取一堆数据,对其进行处理,比较另一个表中的一些数据,并将结果打印到CSV格式的文件中。

这个脚本将运行数十万次迭代来完成。我遇到的问题是,即使在数组中使用unset(),在MySQL查询中使用free(),内存也会持续使用,直到大约350000次迭代时内存耗尽。

毫无疑问,每次运行脚本时,memory_get_usage()报告的内存分配都保持不变,直到大约1050次迭代。然后它将增加262144个字节。通过测试,它也总是在脚本中完全相同的位置递增。在下面的代码块中,它总是在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

有什么建议吗??

在5.3版本之前,php有一个非常愚蠢的垃圾收集器:php 5中的对象内存泄漏。有了这个,你甚至无法用unset()释放内存。在取消设置之前,您必须中断循环引用,或者只需使用php5.3即可。

您查看了检索的数据吗

$attRow = $AttResults->fetch_object()

在1050迭代之前/前后?

和是的,我会在while中更改赋值,在循环之前取一次,在结束之前取一个,看看内存是否发生了变化。