【问题标题】:What does PHP's gc_enable function do exactly?PHP 的 gc_enable 函数究竟做了什么?
【发布时间】:2011-01-17 16:18:31
【问题描述】:

在您告诉我阅读手册之前,请查看php.net documentation for this function

警告
此功能目前没有文档记录;只有它的参数列表可用。

这很有帮助!

This page 解释说它启用了循环引用的垃圾收集。这在何时何地有用?有人可以给我看一个使用它的例子吗?最好是创建循环引用然后收集的示例。

【问题讨论】:

    标签: php function garbage-collection


    【解决方案1】:

    gc_enable 仅在您调用 gc_disable 时才需要。这样做确实没有合理的理由,因为这会导致循环引用不会被垃圾收集(就像 5.3 之前的版本一样,当循环 GC 不存在时)。

    PHP 的垃圾收集器通过引用计数工作。您可以将变量视为指向对象的“指针”。当一个对象没有指向它的指针时,它是“死的”,因为没有东西可以到达它,所以它被垃圾回收了。

    //one thing points to the Foo object
    $a = new Foo();
    
    //now two things do
    $b = $a;
    
    //now only $b points to it
    $a = null;
    
    //now nothing points to Foo, so php garbage collects the object
    $b = null;
    

    请考虑一下:

    $a = new Foo();
    $b = new Bar();
    $b->foo = $a;
    $a->bar = $b;
    
    $a = $b = null;
    

    此时,除了对象本身之外,没有任何东西可以保留 $a 或 $b。这是一个循环引用,在以前的 php 版本(

    【讨论】:

    • 所以你的意思是默认情况下这是打开的,因此我不必担心它,除非出于某种被遗忘的原因我用gc_disable 将其关闭?
    • @Stephen:是的,没错。老实说,没有理由关闭此功能。收集循环引用的唯一方法是在它打开时。
    • 关闭 GC 的唯一原因是保证脚本性能不受启发式触发 GC 的影响,这会抢占脚本处理。但是,如果脚本会触发 GC 并且 GC 被关闭,那么任何进一步的循环引用都会永远泄露(或者直到操作系统内核终止进程)。
    • 这是一个不错的用例 :) github.com/composer/composer/commit/…
    【解决方案2】:

    有一个完整的chapter on Garbage Collection in the PHP Manual 对此进行了解释:

    我通常尽量不要只链接异地,但觉得总结太多了。

    【讨论】:

    • 优秀...这应该在我引用的函数文档中链接到。
    • @Stephen 在the ini section 中还有对zend.enable_gc 的(简要)描述,其中将其列为默认启用。
    【解决方案3】:

    我们使用gc_disablegc_enable 是有原因的。

    在最新的 PHP 手册中,它指出

    对于大型项目非常有用,当您创建大量应该保留在内存中的对象时。所以 GC 无法清理它们,只会浪费 CPU 时间。

    作曲家的问题: https://github.com/composer/composer/pull/3482#issuecomment-65199153

    解决方案和人员回复: https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799

    请注意,上面的第二个链接包含很多带有图形的cmets。

    【讨论】:

    • 这些回复真是太棒了。
    猜你喜欢
    • 2015-01-26
    • 2012-07-23
    • 2016-09-10
    • 2023-03-15
    • 2012-10-17
    • 2021-06-04
    • 1970-01-01
    • 2018-07-30
    • 2019-10-06
    相关资源
    最近更新 更多