为什么is_array()在PHP中泄漏内存?

时间:2010-09-08 14:53:36

标签: php

根据我的xdebug输出,is_array()会泄漏作为参数传递给它的内存量。如果我传递一个大型数组,它会泄漏大量内存,以便检查它是否是一个数组。

有解决方法吗?

   17.4313   21858520   +70004                   -> is_array() [...]/app/app_model.php:526

以下是导致泄密的代码段:

        $ret = $this->behaviors[$b[$i]]->afterFind($this, $results, true);
        if (is_array($ret)) {
            $results = $ret;
        }

我在Linux上运行它(Ubuntu 9.04)

PHP:5.3.2

xdebug:2.0.5

uname -a给了我这个:

Linux linux8 2.6.28-19-server#64-Ubuntu SMP Wed Aug 18 21:57:33 UTC 2010 i686 GNU / Linux

2 个答案:

答案 0 :(得分:5)

我的第一反应:

Select isn't broken

我的第二反应:

你可以总结三件事:

  • 广泛传播的软件(is_array)被破坏 - 您是第一个注意到的人
  • xdebug已损坏报告无泄漏的地方
  • xdebug和PHP不能很好地协同工作,因为它涉及内存管理

广泛传播和使用的功能通常不是问题。尝试通过运行更简单的代码来缩小“xdebug泄漏报告”的出现范围:

$arr = array_fill( 0, 10000, "content" );
$mallocbytes=true;// set to true to get process 
$usage=memory_get_usage(!$mallocbytes);
for( $i=0; $i!=1000000; $i=$i+1) { 
   is_array($arr); 
   $newusage=memory_get_usage(!$mallocbytes);
   if( $newusage != $usage ) {
      print( "diff after $i'th is_array: ".($newusage-$usage)."\n" );
   }
   $usage=$newusage;
}

看一下PHP运行时的实际内存消耗。我打赌它不会增长。

答案 1 :(得分:0)

http://php.net/manual/en/function.gettype.php可能是一种合适的解决方法。最好的途径是提交修复错误的补丁,但这可能超出了合同的范围。