fut*_*eal 5 php phpunit garbage-collection symfony
从Symfony 2.7开始,Symfony PHPUnit Bridge已经被创建为从测试中获取弃用通知的好方法(参见相关的Symfony博客条目).作为此软件包的一部分,垃圾收集也已被禁用,这似乎使大型测试套件的内存占用空间失控.
例如,没有桥:
Time: 5.01 minutes, Memory: 964.75Mb
OK, but incomplete, skipped, or risky tests!
Tests: 1189, Assertions: 2380, Incomplete: 2.
Run Code Online (Sandbox Code Playgroud)
并且启用了桥接的相同测试套件:
Time: 4.98 minutes, Memory: 3003.00Mb
OK, but incomplete, skipped, or risky tests!
Tests: 1189, Assertions: 2380, Incomplete: 2.
Remaining deprecation notices (9)
Run Code Online (Sandbox Code Playgroud)
在文档中,注意到在测试期间删除垃圾收集旨在减少在某些条件下发生的分段错误,这不是我们尚未经历过的.
我意识到我们可以在特定于应用程序的PHPUnit引导文件中重新启用垃圾收集,或者我们也可以从自动加载器中删除桥接并手动仅注册弃用处理程序.不过,我更感兴趣的是这个包含背后的意图(事实上,可能缺少的是关于如何避免这种行为的一些文档).
除此之外,为了处理这个问题,我们必须对我们构建测试的方式进行相关更改吗?这是一个测试套件,包括许多全栈功能测试和诸如此类的东西.看起来没有垃圾收集的运行可能会破坏许多大型测试套件,除非我遗漏了一些东西.
这是在PHP 5.5.9,PHPUnit 4.7.7和Symfony 2.7.3下.
开启垃圾收集的代码还提到了它被设置为避免的 PHP bug。不存在明确的代码可以轻松可靠地使错误自行显现,并且尚不清楚较新的版本(5.6 和 esp 7.0 系列)是否不会受到该问题的影响。
关闭 gc 也可能会加快运行速度 - 原因与 Composer 所发生的情况完全相同:垃圾收集可能会花费大量时间。
在桥接器中关闭它后,在启动脚本中重新打开它可能有助于记忆。
我更倾向于弄清楚为什么你的测试需要这么多内存 - 查看测试之前和之后使用了多少内存,并清除函数中使用的对象tearDown()
可以在很大程度上清除内存。