我正在编写一个PHP cli程序,它是队列系统的工作进程。
我认为PHP在这种情况下会不时收集垃圾,并且不会经常达到内存限制。
情况似乎并非如此。
git gc
答案 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