2

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

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

因为需要大量内存,所以我想知道 PHP/Apache 如何管理内存。

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

顺便说一句,我正在使用 PHPExcel 库。

4

1 回答 1

2

简短的回答:

PHP 使用引用计数,因此对象一旦没有被引用就会被释放。如果存在引用循环(例如,对象 A 引用对象 B,对象 B 又引用对象 A),垃圾收集器会不时处理它们。

当脚本结束时,所有剩余的内存都返回给系统。

长答案:

脚本终止时是否自动释放内存?如果没有,什么时候会。

只要不再引用对象/变量,就会在脚本执行期间释放内存。

如果由于某种原因在脚本末尾仍然引用了对象,它们将被强制销毁和释放。

然后,内存分配器被重置(这会释放少量剩余分配的内存,就像分配器自己的缓存一样)。

因此,在脚本结束时,所有内容都被释放并再次可供分配。

如果分配器用于mmap()在内部分配内存段(这是 mmap() 可用时的默认设置),那么大块的取消分配和内存分配器的重置也会将内存返回给系统。

我需要隐式释放对象吗?

不。只要确保垃圾收集器已启用,以便处理引用循环。

是否可以从脚本中一次释放一点内存

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
}

手动收集引用周期可能会更早地释放一些内存,尽管通常没有必要。

是不是1024M太多了,长期下来对服务器有什么影响。

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

于 2013-05-23T12:27:23.690 回答