【问题标题】:How does garbage collection work in PHP? Namely, how do local function variables get cleaned up?垃圾回收在 PHP 中是如何工作的?即,如何清理局部函数变量?
【发布时间】:2011-08-10 15:17:59
【问题描述】:

如果我为未在函数内声明为全局的变量赋值,该变量会在函数终止时自动取消设置,还是仅在 PHP 脚本完成执行时取消设置?

我正在尝试确定手动取消设置函数内的临时函数范围变量是否更聪明,或者不用担心,因为它们会被 PHP 引擎自动取消设置。

【问题讨论】:

标签: php variables garbage-collection scope


【解决方案1】:

当函数退出时,该变量将被取消设置,除非它有外部引用来保持它“活着”。变量占用的实际内存是否被释放完全取决于垃圾收集器。 GC 是一项昂贵的操作,PHP 只会在需要时调用它(例如内存越来越紧)。

【讨论】:

  • 除非我的知识已经过时,否则不涉及任何标记和清除,只有一种有趣的引用计数(很有趣,因为 PHP 处理引用和复制的方式)。内存被非常确定地释放。
  • @Daniel:它已经过时了。见php.net/manual/de/features.gc.collecting-cycles.php
  • @daniel:5.3 实现了一个适当的垃圾收集器,可以破坏循环引用。所以$a = &$a; 将不再“楔入”内存中的那个变量。
【解决方案2】:

这完全取决于函数的范围。从理论上讲,您可以让整个脚本在一个函数的范围内运行(希望调用其他函数的函数,但仍然......)。

对于具有最小副作用的合理大小的函数,将对象设置为完全没问题——它们的析构函数将在函数完成时被调用(这是 unset 的第二个效果)并且它们将被清理在函数完成后的第一个清理周期内。对于涉及创建大量对象的较大功能,手动删除对象可能会更好。

【讨论】:

    【解决方案3】:

    Zend 引擎将为您进行清理工作,根据需要减少引用计数

    【讨论】:

    • Refcounting != GC,实际上不如 GC 强大(它不能收集循环)。幸运的是,PHP 自多个版本以来都有真正的 GC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 2011-05-07
    • 2010-10-20
    • 2012-03-21
    相关资源
    最近更新 更多