Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PHP中的数组()会泄漏内存?_Php - Fatal编程技术网

为什么PHP中的数组()会泄漏内存?

为什么PHP中的数组()会泄漏内存?,php,Php,根据我的xdebug输出,is_array()泄漏作为参数传递给它的内存量。如果我给它传递一个大数组,它会泄漏大量内存,只是为了检查它是否是数组 有解决办法吗 17.4313 21858520 +70004 -> is_array() [...]/app/app_model.php:526 以下是导致泄漏的代码片段: $ret = $this->behaviors[$b[$i]]->afterFind($thi

根据我的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可能是一个合适的解决方案。最好的办法是提交一个修补程序来修复bug,但这可能超出了您的合同范围。

我的第一反应:

我的第二个反应是:

你可以总结三件事:

  • 一个广泛传播的软件(
    is_array
    )坏了-你是第一个注意到的
  • xdebug is break在没有泄漏的情况下报告泄漏
  • 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运行时的实际内存消耗情况。我打赌它不会增长。

我想你忘了指定PHP版本和代码,这应该与这次泄漏有关<代码>插入phpjoke()什么是“内存泄漏”?调用后内存没有回收?我无法在这里复制:您是否启用了
xdebug.collect_params
,如果禁用它会发生什么?检查:否,collect params似乎不是罪魁祸首,我无法复制它。可能需要一些版本号(PHP&xdebug)、操作系统和特定的测试脚本。如果您想知道会发生什么,只需查看源代码:运行示例后,我相信问题出在xdebug中,而不是在PHP运行时。