2010-07-28 28 views
4

我有一個命令行腳本,它通過循環運行array()文件,並使用文件名作爲參數來調用輔助對象上的方法。在PHP中調試內存泄漏/用法錯誤的工具/技巧

每個通過腳本運行PHP的memory_get_usage報道越來越大的數量

53294264 
57019624 
61374624 
65699176 
70230600 
75157152 
79900392 
84630472 
89359264 
94300016 
100031176 
105202448 
110360808 
115777528 
121146976 
126784824 
132366952 

,直到我有錯誤了

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted 

很顯然,事情正在泄漏內存,或某種全球/靜態存儲區不斷被添加到。在PHP中調試這種錯誤的最佳方法是什麼?在PHP中無意中發生這種常見情況嗎? xDebug有一些神奇的選項可以幫助我確定嗎?其他工具?

我已經想到的最好的方法是跟蹤執行鏈並拋出代碼庫,調用memory_get_usage(),直到找到確切的問題,但這似乎是一種單調乏味的低效方法。

+2

我也有類似的問題http://stackoverflow.com/questions/849549/finding-cause-of-memory-leaks-in - 高-PHP-堆棧。不幸的是,它沒有產生任何'奇蹟'解決方案。 – 2010-07-28 01:39:43

+0

有用的信息,雖然邁克,感謝您的指針。 – 2010-07-28 02:16:00

+0

針對有興趣的人的解決方法。我最終爲我的腳本寫了一個bash包裝器。腳本本身檢查當前內存使用情況(http://us3.php.net/memory_Get_usage)與內存限制(http://us3.php.net/manual/en/ini.core.php#ini.memory - 限制),並且當我們開始用完時,用特定的退出代碼(出口(1))保釋。如果bash腳本檢測到退出代碼,它會自行產生。正在循環的對象是通過從外部源讀取ID列表構建的,並且每次腳本成功通過循環時都會更新此列表。 – 2010-07-29 17:01:36

回答

5

它看起來像Facebook的xhprof規定memory profiling at the function call level

(我從來沒有用過它,但真正要...)

+0

我相信它只能在* nix平臺上運行,所以如果你在Windows上開發,那麼你的運氣不好。 – 2010-07-28 07:45:10

+0

看起來很酷。我必須試一試。 – 2010-07-28 13:10:28