2013-02-22 78 views
0

我有一個連續運行的多進程PHP(CLI)應用程序。我試圖優化內存使用情況,因爲每個進程使用的內存量限制了我可以在任何給定時間運行的分叉數量(因爲我有可用的有限內存量)。我嘗試了幾種方法。例如,按照preinheimer給出的建議,我重新編譯了PHP,禁用了所有擴展,然後只重新啓用了我的應用程序(mysql,curl,pcntl,posix和json)所需的擴展。但是,這並沒有減少內存使用量。它實際上略有增加。如何減少多進程PHP應用程序的內存佔用

我幾乎準備放棄多進程方法,但我正在做最後的努力,看看其他人是否有更好的想法來減少內存使用量。我將發佈我的替代方法,這涉及到我的應用程序的重大重構,下面。

非常感謝任何能幫助我解決這個挑戰的人!

+0

雖然這不是一個真正的答案你的問題,但建議看看: 你有看看PHP的hiphop? PHP嘻哈重新編譯你的PHP到C++。最終這可能適用於您,但這取決於您如何編寫代碼以及用於函數的內容。我不知道它是否適用於pcntl,但根據我的經驗,它可能會大大提高速度和內存使用量。 – 2013-02-22 08:52:27

+0

是的,我其實。我在研究這個問題時遇到了它的存在。我沒有嘗試HipHop的主要原因是因爲我沒有經驗(不是一個很好的理由,我知道)。這是一個很好的建議,我認爲它可以對這個問題形成一個很好的答案。如果你有經驗,你想在回答中提出一些想法嗎? – robguinness 2013-02-22 09:11:37

回答

0

多進程PHP應用程序(例如使用pcntl_fork()自行分叉的應用程序)在內存方面本質上效率低下,因爲每個子進程都會將php可執行文件的整個副本加載到內存中。這可以輕鬆地等同於每個進程10 MB或更多內存(取決於應用程序)。從理論上講,將擴展編譯爲共享庫應該會減少內存佔用量,但是我的成功有限(實際上,由於某些未知原因,我的嘗試使內存使用變得更糟)。

更好的方法是使用多線程。在這種方法中,應用程序駐留在單個進程中,但是可以在單獨的線程中同時執行多個動作(即,多任務)。傳統上PHP不適合多線程應用程序,但最近一些新的擴展使PHP中的多線程更加可行。例如,請參閱this answer以瞭解PHP中的多線程問題(其接受的答案相當過時)。

對於上述問題,我計劃使用pthreads將我的應用程序重構爲多線程應用程序。這需要大量的修改,但它(希望)會爲應用程序帶來更高效的整體架構。我會繼續更新這個答案,併爲其他願意做類似事情的人提供一些重新考慮的例子。其他人可隨時提供反饋,並用代碼示例更新此答案!

*有關併發性的腳註:除非有多核機器,否則將不會同時執行。但他們將被安排在不同的小時間片上運行在CPU上。從用戶角度來看,他們似乎會同時運行。

相關問題