【发布时间】:2011-01-17 16:18:31
【问题描述】:
在您告诉我阅读手册之前,请查看php.net documentation for this function:
警告
此功能目前没有文档记录;只有它的参数列表可用。
这很有帮助!
This page 解释说它启用了循环引用的垃圾收集。这在何时何地有用?有人可以给我看一个使用它的例子吗?最好是创建循环引用然后收集的示例。
【问题讨论】:
标签: php function garbage-collection
在您告诉我阅读手册之前,请查看php.net documentation for this function:
警告
此功能目前没有文档记录;只有它的参数列表可用。
这很有帮助!
This page 解释说它启用了循环引用的垃圾收集。这在何时何地有用?有人可以给我看一个使用它的例子吗?最好是创建循环引用然后收集的示例。
【问题讨论】:
标签: php function garbage-collection
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 将其关闭?
有一个完整的chapter on Garbage Collection in the PHP Manual 对此进行了解释:
我通常尽量不要只链接异地,但觉得总结太多了。
【讨论】:
我们使用gc_disable 和gc_enable 是有原因的。
在最新的 PHP 手册中,它指出
对于大型项目非常有用,当您创建大量应该保留在内存中的对象时。所以 GC 无法清理它们,只会浪费 CPU 时间。
作曲家的问题: https://github.com/composer/composer/pull/3482#issuecomment-65199153
解决方案和人员回复: https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799
请注意,上面的第二个链接包含很多带有图形的cmets。
【讨论】: