我正在使用Behat测试Symfony2应用程序。虽然每个功能测试在隔离运行时运行愉快,但尝试一次运行整个测试套件会导致PHP内存不足 - 即使memory_limit设置为2GB或更高。
通过回显每个功能结束时的当前内存使用情况,我可以看到每个运行的功能的内存使用量增加了20到50MB。
所以,我的问题是,“在每个功能运行后,我有什么办法可以释放内存吗?”似乎每个功能都在启动另一个Symfony应用程序,因此,我理想的解决方案是在使用@AfterFeature挂钩运行每个功能后,销毁每个Symfony应用程序(假设正在发生的事情)。
更新以添加: 我们使用的是Symfony 2.3.7和Behat 2.5.0。
更新以添加: 一个典型的用例是;
答案 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);