安全地使用PHP ini_set“memory_limit”

时间:2013-05-23 11:50:55

标签: php memory optimization memory-management load

我目前有一个将要运行很长时间的脚本(虽然在它自己独立的进程中分叉)。它不会经常运行,但是当它运行时,它将主要在(许多)XLS文件(> 10 MB)的处理中使用相当大量的内存。

当此脚本运行时,我的内存限制设置为1024M,时间限制为6000秒。这些是上限,但实际上它不需要那么多时间(可能只需要5分钟就够了)。

由于需要大量内存,我想知道PHP / Apache如何管理内存。

  • 脚本终止时是否自动释放内存?如果没有,什么时候会。
  • 我是否需要隐式释放对象?
  • 是否可以从脚本
  • 中一次释放一点内存
  • 1024M太多了,从长远来看它将如何影响服务器。

我顺便使用PHPExcel Library。

1 个答案:

答案 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太多了,从长远来看它将如何影响服务器。

如果在单独的进程中运行这个占用大量内存的脚本,这不会影响服务器。