我认为我在WebTestCase类或内核本身中发现了内存泄漏。我最后的问题。
为了重现,我创建了一个新的空WebTestCase,它可以执行$ max断言(在我的测试中,$ max范围从1到100.000),而无需实例化任何内核。
<?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,我都会使用相同的内存。
但是......现在我在循环中创建并销毁内核。我没有做 - &gt; boot()和 - &gt; 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兆兆。有人正在解放它所分配的资源。
我的问题:
谢谢! 哈维。
答案 0 :(得分:2)
Symfony2代码托管在github.com上,必须在此网站上声明问题https://github.com/symfony/symfony/issues
我在重型网络测试用例中也遇到过这种问题,并且在2.0.x版本中没有修复。我不能确保你是内存泄漏或正常行为...
我建议你使用Google网上论坛邮件列表,然后是GitHub问题。