2009-10-21 43 views
2

我有一個運行在apache/mod_php中的請求處理程序,它偶爾會擴展超出最大允許的內存使用量(即php.ini中的memory_limit定義)。在mod_php中調試內存使用

處理此請求調用proc_open()來運行外部命令。這些命令的內存使用情況是否與請求內存使用情況「相反」?

除此之外,分析和修復在mod_php下運行的腳本的內存使用情況的首選方法是什麼?我發現的所有有關php內存使用情況的信息似乎如下:

  • 「編輯php.ini並提高內存限制!
  • 「編輯您的apache配置並將每個孩子的最大請求數設置爲較低的數字!」

很明顯,這些對性能和穩定性都有負面影響。我怎樣才能真正分析和解決問題,而不是創可貼呢?

Apache日誌錯誤爲:

PHP Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes) in foo.php on line Z

回答

2

我問關於PHP的內存管理一個類似的問題:Diagnosing Memory Leaks - Allowed memory size of # bytes exhausted

我相當肯定,運行從EXEC()或proc_open外部程序()不不計算在PHP的內存限制。

在PHP中跟蹤內存使用情況顯然非常困難。似乎沒有辦法查找符號表或類似的東西。

PHP有幾個內存管理功能,如memory_get_usage()memory_get_peak_usage(),可以獲取腳本中任何給定點使用的內存總量。您可以可以編寫您自己的跟蹤腳本,並將它放在關鍵點尋找內存管理員。

根據代碼堆棧的大小,xdebug的execution trace可能是您最好的選擇。但是,如果你有很多代碼,這可能是矯枉過正的。