php - 安全使用 PHP ini_set "memory_limit"

标签 php memory optimization memory-management load

我目前有一个脚本将运行相当长的时间(尽管在它自己的单独进程中 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/

相关文章:

php - 将日期时间输出更改为今天并中断时间

php - DynamoDb batchGetItem 和分区键和排序键

c++ - shmget shmat 无法正常工作

c - C程序读取文件中的无效指针

assembly - 为什么 "inc dword [esp + ebx]"比 "inc [esp]"快?

php - 在 SQL 语句/查询中使用 jQuery 变量

php - post 形式的数据顺序是否与 web 形式的数据顺序相同?

c - 为什么我的内存布局不同?

optimization - 稀疏几何的 3d 希尔伯特曲线

linux - Linux 上的 CPU 限制后台进程