WebTestCase クラスまたはカーネル自体でメモリ リークを発見したと思います。最後に私の質問。
再現するために、カーネルをインスタンス化せずに $max アサート (私のテストでは、$max の範囲は 1 ~ 100.000) を行う新しい空の WebTestCase を作成します。
<?php
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class DemoTest extends WebTestCase
{
public function testHello( )
{
$max = 100000;
for( $i = 0; $i < 1; $i++ )
{
$this->assertTrue( true );
}
}
}
$max=1 の場合
Time: 0 seconds, Memory: 5.75Mb
OK (1 test, 1 assertion)
$max=100000 の場合
Time: 1 second, Memory: 5.75Mb
OK (1 test, 100000 assertions)
予想通り、1 回実行しても 100.000 回実行しても、同じメモリを消費します。
ここで、任意のクラスを作成し、それを操作して破棄するループを試します。他のクラスを選択する場合と同じ方法で DOMDocument を選択します。
public function testHello( )
{
$max = 100000;
for( $i = 0; $i < $max; $i++ )
{
$dummy = new \DOMDocument();
$dummy->loadHTML( '<html><head><title>dummy</title></head><body>dummy</body></html>' );
unset( $dummy );
$this->assertTrue( true );
}
}
$max=1 の場合
Time: 0 seconds, Memory: 5.75Mb
OK (1 test, 1 assertion)
$max=100000 の場合
Time: 2 seconds, Memory: 5.75Mb
OK (1 test, 100000 assertions)
繰り返しますが、1 回実行するか 100.000 回実行するかに関係なく、同じメモリを消費します。
しかし...今、ループ内でカーネルを作成および破棄します。->boot() も ->shutdown() も実行せず、新しいカーネル オブジェクトを取得するだけで、ブートされることもなく参照されなくなります。
public function testHello( )
{
$max = 10000;
for( $i = 0; $i < $max; $i++ )
{
$dummy = static::createKernel();
unset( $dummy );
$this->assertTrue( true );
}
}
$max=1 の場合
Time: 0 seconds, Memory: 6.25Mb
OK (1 test, 1 assertion)
$max=100000 の場合
Time: 9 seconds, Memory: 165.50Mb
OK (1 test, 100000 assertions)
5.75 から 6.25 に上昇するのは論理的です。これは、カーネルのリソースのサイズである可能性があります。ハーフメガ。しかし、何の操作も行わずに 100.000 個のカーネルを作成すると、165 メガを消費する傾向があるという事実は間違っています。誰かが割り当てたリソースを解放しています。
私の質問:
- これは漏れですか?または、予想外の理由で、なぜこのように機能するのかわからないのは予想される動作ですか?
- 私は2.0.10を使用しています。リークである場合、これが新しいバージョンで修正されているかどうかはどうすればわかりますか?
- 修正されていない場合、コアチームに報告する最も簡単な方法はどれですか?
ありがとう!シャビ。