2010-08-17 126 views
4

我有一个小问题,当我们为PHP设置memory_limit时,我明白它会使用该整数作为脚本消耗的最大内存。PHP内存限制

这是否意味着如果我将最大值设置为64MB,并且我的脚本只需要12MB,那么它将使用完整的64MB,仅仅是因为它允许?

我问,因为我注意到我的一些脚本尽管使用了12MB(使用get_memory_usage发现),但httpd进程本身正在接近64MB标记,即使这是唯一的脚本运行!顺便说一句,我没有内存泄漏问题。

它是否也会出现其他进程,即CMD将被添加到httpd进程整体内存使用情况?

非常感谢任何帮助,为我清理这个。

+1

*(旁注)*为了获得脚本在其生命周期中消耗的最大内存,请使用['memory_get_peak_usage'](http://de.php.net/manual/en/function.memory-get-peak-usage。 PHP)在脚本的末尾。 – Gordon 2010-08-17 09:55:45

+0

“,但httpd进程本身已经接近64MB” - 你在哪里看到(你使用哪个程序)以及你指的是哪个值? – VolkerK 2010-08-17 09:59:52

+0

@VolkerK - 我在一台Windows机器上,因此我在“内存”列下的“进程”选项卡上使用“任务管理器”。 – Abs 2010-08-17 10:06:16

回答

5

PHP的memory_limit只考虑由Zend引擎的内存管理器处理的内存(参见Zend/zend_alloc.c),并且该管理器不会通过memory_limit“pre-emptively”(尽管它分配新的内存段)分配设置的数量。并不是“内部”的所有内容都由内存管理器处理,但大部分都是。你的php实例产生的其他进程不会“继承”内存管理器。因此,它们的内存消耗不计入memory_limit。

您在任务管理器中看到的内容很可能是httpd进程的working set包括由php分配的内存(由内存管理器处理或不处理),如果它被安装为apache模块。但也包括目前在物理内存中的httpd的其他内容。但它不包括产生的进程分配的内存量。

+0

非常感谢你,这是我需要的解释! – Abs 2010-08-17 13:19:58