10 MB)。 当此脚本以 6000 -6ren">
gpt4 book ai didi

php - 安全使用 PHP ini_set "memory_limit"

转载 作者:行者123 更新时间:2023-12-03 17:33:03 24 4
gpt4 key购买 nike

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com