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

Map*_*Dot 8 php

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

这有解决方法吗?

   17.4313   21858520   +70004                   -> is_array() [...]/app/app_model.php:526
Run Code Online (Sandbox Code Playgroud)

这是导致泄漏的代码片段:

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

我在Linux上运行它(Ubuntu 9.04)

PHP:5.3.2

xdebug:2.0.5

uname -a给了我这个:

Linux的LINUX8 2.6.28-19服务器#64 Ubuntu的SMP周三08月18日21时57分33秒UTC 2010 i686的GNU/Linux的

xto*_*ofl 5

我的第一反应:

选择没有打破.

我的第二反应:

你可以得出以下三点:

  • 广泛传播的软件(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;
}
Run Code Online (Sandbox Code Playgroud)

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