清除PHP正在使用的内存

Cal*_*dge 11 php memory phpunit

我遇到了一个有趣的问题.我正在使用PHPUnit,我的测试每次运行时都会占用更多内存.IE浏览器...

2.25 MB

2.5 MB

3.0 MB

3.5 MB .......

有谁知道如何清除正在消耗的内存,任何人都可以建议我深入探讨这个问题吗?当前的问题是我的一些较大的测试耗尽了内存,并且只是继续增加PHP中的最大内存分配还不够......我需要知道为什么从命令行运行的PHPUnit测试会有内存在运行之间"粘附"的用法.

edo*_*ian 25

内存增加有三到四个原因:

1)PHPUnit收集代码覆盖率数据

除了关闭代码覆盖率之外,你无能为力.

2)PHPUnit缓存文件令牌以获取代码覆盖率

您可以<phpunit cacheTokens="false">在PHPUnit xml中使用.请参阅http://phpunit.de/manual/current/en/installation.html#installing.upgrading中有关此内容的说明

3)PHPUnit自身没有正确清理

在其当前实现中,它保留了测试用例,因为存储结果数据的位置.在未来,这将被改变为更有效,但现在它是如何工作的.

4)通向"4":你需要在自己之后清理

由于TestCase实例保持不变,因此您的成员变量也会被保留.

意思是你可以通过使用来节省大量内存

public function tearDown() {
    unset($this->whatever);
}
Run Code Online (Sandbox Code Playgroud)

但这样做非常乏味.

我的建议是为你的所有TestCase建立一个基础测试类并使用它:

class MyBaseTest extends \PHPUnit_Framework_TestCase {

    protected function tearDown()
    {
        $refl = new \ReflectionObject($this);
        foreach ($refl->getProperties() as $prop) {
            if (!$prop->isStatic() && 0 !== strpos($prop->getDeclaringClass()->getName(), 'PHPUnit_')) {
                $prop->setAccessible(true);
                $prop->setValue($this, null);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将以一种不错的自动方式清理完毕.

(该片段的道具请访问:http://kriswallsmith.net/post/18029585104/faster-phpunit)


PHPUnit不能以向后兼容的方式执行此操作,不会破坏人们的项目,因此您必须为自己添加它:)


小智 6

PHPUnit 垃圾收集背后的技术细节已经由 @edorian 和 @mauris 介绍,但我想补充一点,PHPUnit(至少在我正在运行的 3.7.21 版本中)使您能够添加注释:

/**
 * @backupGlobals disabled
 */
class MyClassTests extends PHPUnit_Framework_TestCase{}
Run Code Online (Sandbox Code Playgroud)

在添加注释之前,我在每次运行测试套件时大约将内存使用量增加了一倍,最后一次运行时内存使用量约为 1100 MB。现在它们的运行速度为 15 MB。


mau*_*ris 5

根据聊天中的讨论,Calvin 是由于缺少重置功能.

在测试时,我们必须确保测试环境一致,以便我们能够获得准确的结果.计算是输入/输出,因此我们应该使用PHPUnit中的Fixtures重置存储以防止像这样的"内存泄漏".