【问题标题】:Does PHP garbage collect function-scoped objects after a call returns?调用返回后,PHP 是否会垃圾收集函数范围的对象?
【发布时间】:2016-10-21 04:49:55
【问题描述】:

我知道一旦脚本结束,all objects are destroyed 和内存就会返回。一旦函数结束并且无论如何都无法访问,这是否也会发生在函数范围的对象上?

例如,我担心我的 PHPUnit 测试中的内存泄漏,我为几乎每个测试创建一个新对象。如果我运行足够多的测试,这最终会溢出我的堆吗?

public function testMyFunction()
{
    // Arrange
    $myObject = new MyClass();

    // Act
    $return = $myObject->myFunction();

    // Assert
    $this->assertEquals(true, $return);

}

我是否应该手动 unsetting 他们在“Absterge”部分中长时间运行脚本?

public function testMyFunction()
{
    // Arrange
    $myObject = new MyClass();

    // Act
    $return = $myObject->myFunction();

    // Assert
    $this->assertEquals(true, $return);

    // Absterge
    unset($myObject);
}

【问题讨论】:

    标签: php memory memory-management phpunit


    【解决方案1】:

    一旦对一个对象的所有引用都消失了,PHP 将进行垃圾收集。

    unset 不需要。但是,您可能存在循环依赖,在这种情况下,它可能不会被垃圾回收。

    使用unset() 的唯一原因是您希望在函数结束之前释放内存。如果还有其他东西持有对您正在取消设置的东西的引用,unset() 只会删除局部变量,而不是对象本身。

    有一个特殊的垃圾回收周期可以清理循环引用。你可以用这个 php.ini 设置来控制它:

    http://ca2.php.net/manual/en/info.configuration.php#ini.zend.enable-gc

    如果您有兴趣测试对象何时以及是否会被垃圾回收,您可以添加一个__destruct 方法。

    【讨论】:

    • 抱歉,我花了这么长时间才回过头来测试您的答案。使用__destruct 方法进行测试是我错过的明显见解。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多