我目前有一个脚本将运行相当长的时间(尽管在它自己的单独进程中 fork )。它不会经常运行,但当它运行时,它将使用相当大量的内存,主要是在处理(许多)XLS 文件(> 10 MB)时。
当前,当此脚本运行时间限制为 6000 秒时,我将内存限制设置为 1024M。这些都是上限,但实际上并不需要那么多时间(可能只需要 5 分钟就足够了)。
因为需要大量内存,我想知道 PHP/Apache 如何管理内存。
- 脚本终止时内存会自动释放吗?如果没有,那什么时候会。
- 我需要隐式释放对象吗?
- 是否可以在脚本中一次释放一点内存
- 1024M是不是太多了,长期来看对服务器有什么影响。
顺便说一句,我正在使用 PHPExcel 库。
最佳答案
简短回答:
PHP 使用引用计数,因此对象一旦未被引用就会被释放。如果存在引用循环(例如对象 A 引用对象 B,对象 B 又引用对象 A),垃圾收集器会时不时地处理它们。
当脚本结束时,所有剩余内存将返回给系统。
长答案:
Is the memory freed automatically when the script terminates? If not, when will it be.
一旦不再引用对象/变量,内存就会在脚本执行期间被释放。
如果由于某种原因对象在脚本末尾仍然被引用,它们将被强制销毁和释放。
然后,内存分配器被重置(这会释放少量剩余的已分配内存,例如分配器自己的缓存)。
因此,在脚本结束时,所有内容都被释放并可再次分配。
如果分配器使用mmap()
在内部分配内存段(这是mmap()可用时的默认设置),那么也会取消大块的分配,并重置内存分配器将内存返回给系统。
Do I need to implicitly free objects?
没有。只需确保 garbage collector is enabled ,以便处理引用循环。
Is it possible to free memory a little bit at a time from within the script
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可能会提前释放一些内存,尽管通常没有必要。
Is 1024M too much, how is it going to affect the server in the long run.
如果您在单独的进程中运行这个占用大量内存的脚本,这不会影响服务器。
关于php - 安全使用 PHP ini_set "memory_limit",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16713180/