我正在使用Behat来测试Symfony2应用程序.虽然每个功能测试在隔离运行时运行愉快,但尝试一次运行整个测试套件会导致PHP内存不足 - 即使memory_limit设置为2GB或更高.
通过回显每个功能结束时的当前内存使用情况,我可以看到运行的每个功能的内存使用量增加了20到50MB.
所以,我的问题是,"在每个功能运行后,我有什么办法可以释放内存吗?" 似乎每个功能都在启动另一个Symfony应用程序,因此,我理想的解决方案是在使用@AfterFeature挂钩运行每个功能后销毁每个Symfony应用程序(假设正在发生的事情).
更新为:我们正在使用Symfony 2.3.7和Behat 2.5.0.
更新添加:典型用例是;
通常,PHP 软件并不是以能够释放内存的方式编写的。相反,该软件依赖于这样一个事实:它可能只运行一两秒就终止,从而清除内存。
当您运行这样的测试时,您可能会在主应用程序中遇到内存泄漏。在代码调用的函数周围添加额外的内存检查,然后在这些函数调用的函数周围添加额外的内存检查,等等,直到找到罪魁祸首。
根据我的经验,问题通常是在循环中重用对象变量:
function f() {
foreach ($list as $item) {
$x = new C($item);
$x->doStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
通常当“f”退出时,所有内存都会被清理。但 PHP 很愚蠢,所以它通过查看局部变量或其他东西来解决这个问题,因为只有最后的 $x 才会被清理。在该循环中之前创建的那些将只会泄漏,直到脚本退出。
如果这确实是问题所在,您可以在再次使用变量之前使用 unset 来修复它。
$x = new C($item);
$x->doStuff();
unset($x);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1066 次 |
| 最近记录: |