Behat吃着记忆

时间:2013-11-20 21:07:15

标签: php symfony behat

我正在使用Behat测试Symfony2应用程序。虽然每个功能测试在隔离运行时运行愉快,但尝试一次运行整个测试套件会导致PHP内存不足 - 即使memory_limit设置为2GB或更高。

通过回显每个功能结束时的当前内存使用情况,我可以看到每个运行的功能的内存使用量增加了20到50MB。

所以,我的问题是,“在每个功能运行后,我有什么办法可以释放内存吗?”似乎每个功能都在启动另一个Symfony应用程序,因此,我理想的解决方案是在使用@AfterFeature挂钩运行每个功能后,销毁每个Symfony应用程序(假设正在发生的事情)。

更新以添加: 我们使用的是Symfony 2.3.7和Behat 2.5.0。

更新以添加: 一个典型的用例是;

  • 使用Doctrine将系统/实体置于已知状态;
  • 模拟用户点击各种链接,填写表单字段等;
  • 使用Doctrine检查实体是否为预期状态

1 个答案:

答案 0 :(得分:2)

通常,PHP软件不是以能够释放内存的方式编写的。相反,该软件依赖于它可能仅在终止之前运行一两秒,从而清除内存。

当你运行这样的测试时,你可能会在主应用程序中遇到内存泄漏。在代码调用的函数周围添加额外的内存检查,然后围绕这些函数调用的函数等,直到找到罪魁祸首。

根据我的经验,问题通常是在循环中重用对象变量:

function f() {
    foreach ($list as $item) {
        $x = new C($item);
        $x->doStuff();
    }
}

通常当“f”退出时,所有内存都会被清除。但PHP是愚蠢的,所以它通过查看局部变量或其他东西来解决这个问题,因为只有最后的$ x才会被清理干净。在该循环中创建的那些将直接泄漏,直到脚本退出。

如果这是 - 事实上 - 问题,您可以在再次使用之前使用unset对变量进行修复。

$x = new C($item);
$x->doStuff();
unset($x);