gpt4 book ai didi

php - 清除 PHP 正在使用的内存

转载 作者:IT王子 更新时间:2023-10-28 23:32:58 25 4
gpt4 key购买 nike

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

2.25 MB

2.5 MB

3.0 MB

3.5 MB.......

有谁知道如何清除正在消耗的内存,有人可以建议我深入探索这个吗?直接的问题是我的一些较大的测试内存不足,仅仅继续增加 PHP 中的最大内存分配还不够好......我需要知道为什么从命令行运行的 PHPUnit 测试会有内存在运行之间“停留”的用法。

最佳答案

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

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

除了关闭代码覆盖之外,您无能为力。

2) PHPUnit 缓存文件 token 以进行代码覆盖

您可以使用 <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);
}

但这样做非常乏味。

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

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->getType()?->allowsNull() !== false
) {
$prop->setAccessible(true);
$prop->setValue($this, null);
}
}
}
}

这将在您之后以一种很好的自动化方式进行清理。

(片段的 Prop 转到:http://kriswallsmith.net/post/18029585104/faster-phpunit)


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

关于php - 清除 PHP 正在使用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13537545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com