什么时候PHP在长时间运行的脚本中运行垃圾收集?

时间:2016-08-09 12:12:28

标签: php garbage-collection

我正在编写一个PHP cli程序,它是队列系统的工作进程。

我认为PHP在这种情况下会不时收集垃圾,并且不会经常达到内存限制。

情况似乎并非如此。

备注

  • 在PHP 7上运行
  • 它是一个长期运行的脚本
  • git gc
  • 没有全局变量

1 个答案:

答案 0 :(得分:4)

归结为此。您通过调用zend.enable_gc = 1手动触发垃圾回收。

我已经写了一堆代码来尝试跟踪它,然后归结为两个脚本:

这个没有崩溃:

gc_collect_cycles()

这一次崩溃了:

for($i = 0;$i < 100;$i++) {
    useMemory();
    gc_collect_cycles();
}

以下是在Blackfire

上比较这些脚本的链接

正如您所看到的,当您不打电话给for($i = 0;$i < 100;$i++) { useMemory(); } 时,它永远不会发生,并且您达到内存限制,并且PHP会自行杀死。

PHP甚至没有把这个机会用于GC本身。这背后的原因在PHP-DEV mailing list上进行了讨论,但基本上归结为在达到内存限制时如何运行需要内存的gc_collect_cycles方法的复杂性。 (还有错误跟踪器#60982)。

内存使用功能:

这是我以前使用的代码&#39;浪费&#39;内存,它有目的地创建只能由垃圾收集器清理的循环引用。请注意,如果没有这些循环,对象将在超出范围时通过引用计数进行清理。

__destruct