我有一個運行無限長(無限主事件循環)處理來自Twitter的鳴叫傳入的流,並將其存儲到MySQL的PHP腳本。但是,我似乎無法控制其內存使用情況。我發現3種方式來衡量內存使用:解決PHP內存泄漏
memory_get_usage()
- 約4.0 MBmemory_get_usage(true)
報告 - 報告約7.5 MBexec("ps -o rss -p " . getmypid(), $memOutput);
- 報告線性增加的數量快速增長到數百MB在60分鐘或更短的時間內,並繼續吞噬內存,直到腳本被強行終止。
我的問題:
1)什麼是這三個措施之間的實際差別?
但主要是:
2)什麼意思,如果前兩個是相對恆定的,但第三個方法是瘋狂了這樣的控制?
FWIW,我使用PHP 5.3與Zend框架1.x和很多Zend_Db的活動。腳本在CLI SAPI下運行。 Zend_Db_Profiler沒有被使用。我還有第二個無限制運行的腳本,它根本不使用數據庫,並且內存使用情況不變。因此,它似乎是與數據庫相關的,也許是MySQL擴展我的PHP安裝使用,也可能Zend_Db的。我已經在我自己的代碼中不厭其煩地避免不小心緩存的對象,雖然我還沒有與Zend的代碼本身做到了這一點。
我試過讓腳本調用gc_enable()
,並定期運行gc_collect_cycles()
,但這沒有幫助。
任何想法?
編輯我打算只要我可以分析這個代碼,但同時我也注意到,即使我的腳本不碰DB也被泄漏內存。但是他們的速度要慢得多,只有在幾天的時間內比較內存使用情況纔會顯現出來。
在不需要對象之後,爲了回收內存,您已經採取了哪些步驟? –
首先,我通過使用數組來瞬間存儲數據,從而避免使用對象。但關於對象(比如Zend_Db返回的錶行),我沒有做任何特殊的事情來回收它們的內存。我的理解是,當它們超出範圍(即方法結束時),並且不再引用這些對象時,它們便有資格通過PHP的垃圾回收進行回收。我不保留任何引用。但我意識到Zend_Db可能是。 – curtisdf