我目前有一个将要运行很长时间的脚本(虽然在它自己独立的进程中分叉)。它不会经常运行,但是当它运行时,它将主要在(许多)XLS文件(> 10 MB)的处理中使用相当大量的内存。
当此脚本运行时,我的内存限制设置为1024M,时间限制为6000秒。这些是上限,但实际上它不需要那么多时间(可能只需要5分钟就够了)。
由于需要大量内存,我想知道PHP / Apache如何管理内存。
我顺便使用PHPExcel Library。
答案 0 :(得分:2)
PHP使用引用计数,因此只要未引用对象就会释放它们。如果存在引用循环(例如,对象A引用引用对象A的对象B),则垃圾收集器会不时地处理它们。
当脚本结束时,所有剩余的内存都将返回给系统。
脚本终止时是否自动释放内存?如果没有,什么时候会。
只要不再引用对象/变量,就会在脚本执行期间释放内存。
如果由于某种原因在脚本末尾仍然引用了对象,则会强行销毁它们并将其释放。
然后,重置内存分配器(释放少量剩余的已分配内存,如分配器自己的缓存)。
因此,在脚本结束时,所有内容都将被释放并可再次分配。
如果分配器使用mmap()
在内部分配内存段(这是mmap()可用时的默认值),那么大块的解除分配和内存分配器的重置也会将内存返回给系统
我是否需要隐式释放对象?
没有。只需确保garbage collector is enabled,以便处理参考周期。
是否可以从脚本中一次释放一点内存
PHP使用引用计数,并在不再引用它们时立即释放对象:
$a = new stdClass;
$a = null; // the object is freed at this point
function foo () {
$a = new stdClass;
return; // the object referenced by $a is freed at this point
}
收集参考周期manually可能会提前释放一些记忆,尽管通常没有必要。
1024M太多了,从长远来看它将如何影响服务器。
如果在单独的进程中运行这个占用大量内存的脚本,这不会影响服务器。