8


3

PHPでis_array()がメモリをリークするのはなぜですか?

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 Answer


5


私の最初の反応:

私の第二の反応:

次の3つのことを結論付けることができます。

  • 広く普及しているソフトウェア( is_array)が壊れています-あなたは 最初に気づくもの

  • xdebug is brokenは、リークがないことを報告します

  • xdebugとPHPはメモリに関するものであるため、うまく機能しません。 管理

広く普及し使用されている機能はほとんどの場合問題ではありません。 より単純なコードを実行して、「xdebug leak report」の発生を絞り込むようにしてください。

$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ランタイムの実際のメモリ消費量を見てください。 私はそれが成長しないに違いない。


0


http://php.net/manual/en/function.gettype.phpが適切な回避策かもしれません。 最善の方法は、バグを修正するパッチを提出することですが、それは契約の範囲外である可能性があります。