2013-07-10 35 views
13

有人可以澄清的$real_usage參數的確切區別嗎?PHP memory_get_usage(false)vs memory_get_usage(true)

manual狀態:

Set this to TRUE to get the real size of memory allocated from system. If not set or FALSE only the memory used by emalloc() is reported.

但有什麼區別? 哪個值可與memory_limit INI設置相媲美?

對於一些長時間運行的腳本,我得到了250MB的實際使用量和50MB的emalloc使用量。這怎麼可能?

我試圖分析一些內存泄漏問題,memory_get_usage()是我需要充分理解的重要指標。謝謝。

+0

你可能已經通過這個仍然共享鏈接。 [內存管理](http://docstore.mik.ua/orelly/webprog/php/ch14_05.htm)和[內存的PHP基礎知識](http://php.net/manual/en/internals2.memory。 management.php#internals2.memory.management.apis)..請閱讀從第二個鏈接 – Yogesh

+0

鏈接添加的第二段的最後一句。您的意思是*「當PHP以調試模式(--enable-debug)構建時,檢測到的泄漏被報告,在完美的世界中,他們永遠無法部署。」*?這怎麼回答我的問題? –

+0

我認爲我誤將它「內置」爲「in」。我爲此表示歉意。我讀過它,因爲我們可以將調試模式設置爲ON以查看內存泄漏 – Yogesh

回答

8

真實內存是爲PHP進程保留的內存量。 PHP以大塊保留內存,這將是< = memory_limit,並且在腳本執行期間可能會增加。例如。如果填充了一個塊,然後嘗試分配給一個新變量,它將保留另一個塊。

如果將該參數設置爲FALSE,則它只報告PHP在保留內存中實際使用的內存量。這會增加每次你分配一個新的變量,或調用一個函數等

如果你有興趣在實際使用的內存量,那麼你會想要真正的內存。

如果您正在調試或試圖調整一段代碼,您可能會對emalloc()內存更感興趣。這將允許您在分配或函數調用之前和之後檢查內存並計算增量。

+0

如果我要達到'memory_limit' INI設置,我需要檢測哪個參數設置? *(對於內部緩存,我需要大量內存,並且在需要時我需要釋放部分緩存以避免超出內存限制)* –

+0

這取決於您希望它接近memory_limit設置的距離。我可能會建議將該參數設置爲FALSE以獲取emalloc()用法。 –

+0

根據我的測試(在PHP 5.5中),'memory_limit' INI設置基於'memory_get_usage(true)'的值。所以你的腳本實際上可能會在崩潰之前使用比最大值小的許多KB。 '''<?php ini_set('memory_limit','500K'); 回聲「內存限制:」。 ini_get('memory_limit')。 「\ n」 個; $ x ='A'; ($ i = 0; $ i <= 100; $ i ++){ echo memory_get_usage(false)。 「vs」。 memory_get_usage(真)。 「\ n」 個; $ x = $ x。'一個'; } ''' 輸出: 內存限制:500K 226688 262144 VS 226992 262144 VS 致命錯誤:512000個字節允許存儲器大小耗盡 – william