PHP的gc_enable函数究竟做了什么?

时间:2011-01-17 16:18:31

标签: php function garbage-collection

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

  

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

这很有用!

This page解释说它可以为循环引用启用垃圾收集。这在何时何地有用?有人能告诉我一个使用它的例子吗?优选地,创建并随后收集循环参考的示例。

3 个答案:

答案 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_disablegc_enable

在最新的PHP手册中,它说明了

  

当您创建大量应保留在内存中的对象时,对大项目非常有用。因此GC无法清理它们而只是浪费CPU时间。

     

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

     

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

请注意,上面的第二个链接包含很多关于图形的评论。