使用Symfony和PHPUnit桥减少内存使用量

时间:2015-08-02 21:59:33

标签: php symfony garbage-collection phpunit

从Symfony 2.7开始,Symfony PHPUnit Bridge已被创建为从测试中获取弃用通知的好方法(请参阅associated Symfony blog entry)。作为此软件包的一部分,垃圾收集也已被禁用,这似乎使大型测试套件的内存占用空间失控。

例如,没有桥:

Time: 5.01 minutes, Memory: 964.75Mb

OK, but incomplete, skipped, or risky tests! 
Tests: 1189, Assertions: 2380, Incomplete: 2.

启用桥接的同一测试套件:

Time: 4.98 minutes, Memory: 3003.00Mb

OK, but incomplete, skipped, or risky tests!
Tests: 1189, Assertions: 2380, Incomplete: 2.

Remaining deprecation notices (9)

在文档中,注意到在测试期间删除垃圾收集旨在减少在某些条件下发生的分段错误,这不是我们尚未经历过的。

我意识到我们可以在特定于应用程序的PHPUnit引导文件中重新启用垃圾收集,或者我们也可以从自动加载器中删除桥接并手动仅注册弃用处理程序。不过,我更感兴趣的是这个包含背后的意图(事实上,可能缺少的是关于如何避免这种行为的一些文档)。

除此之外,为了处理这个问题,我们必须对我们构建测试的方式进行相关更改吗?这是一个测试套件,包括许多全栈功能测试和诸如此类的东西。看起来没有垃圾收集的运行可能会破坏许多大型测试套件,除非我遗漏了一些东西。

这是在PHP 5.5.9,PHPUnit 4.7.7和Symfony 2.7.3。

之下

1 个答案:

答案 0 :(得分:2)

转换垃圾收集的代码也提到了PHP bug that it is set to avoid。没有确定的代码可以轻松可靠地使错误显示出来,并且不清楚更新版本(在5.6和esp 7.0系列中)是否可以免受此问题的影响。

转换gc,也可以加快运行速度 - 与Composer所发生的原因完全相同 - 垃圾收集可能需要很长时间。

在启动脚本中将其重新打开,在桥中关闭之后可能有助于内存。

我更倾向于弄清楚为什么你的测试占用了这么多内存 - 看看在测试之前和之后使用了多少内存,清除tearDown()函数中使用的对象可以做很多事情。记忆清楚。