在您告诉我阅读本手册之前,请查看php.net documentation for this function:
警告
目前没有记录此功能;只有它的参数列表可用。
这很有用!
This page解释说它可以为循环引用启用垃圾收集。这在何时何地有用?有人能告诉我一个使用它的例子吗?优选地,创建并随后收集循环参考的示例。
答案 0 :(得分:14)
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(< 5.3)中,将不会收集。 5.3中的循环收集器现在可以检测到这些并清理这些对象。
答案 1 :(得分:8)
有一个完整的chapter on Garbage Collection in the PHP Manual解释这个:
我通常不会只是将异地链接起来,但总觉得它太过分了。
答案 2 :(得分:2)
我们有理由使用gc_disable
和gc_enable
。
在最新的PHP手册中,它说明了
当您创建大量应保留在内存中的对象时,对大项目非常有用。因此GC无法清理它们而只是浪费CPU时间。
作曲家中的问题: https://github.com/composer/composer/pull/3482#issuecomment-65199153
解决方案和人们的回复: https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799
请注意,上面的第二个链接包含很多关于图形的评论。