2010-08-17 71 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