簡介:這是[轉]FastCGI模式下PHP佔用大量記憶體的解決辦法的詳細頁面,介紹了和php,php, cgi, rails, lighttpd, fastcgi [轉]FastCGI模式下PHP佔用大量記憶體的解決辦法有關的知識、技巧、經驗,和一些php源碼等。
class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=351503' scrolling='no'>
原文【https://guangxin.name/plink/tech/php/2010/344.html】
很長一段時間以來,我注意到工作在FastCGI模式下的PHP會佔用越來越多的記憶體,而且似乎從不釋放。起初我以為這是記憶體流失的問題,但是各個PHP社區的人好像並沒有把這個當作問題。我搜尋了一下,發現還有不少人面臨同樣的問題。來自PHP官方的一個比較正式的解釋是:php-cgi進程並沒有記憶體流失,php-cgi會在每個請求結束的時候回收指令碼使用的全部記憶體,但是並不會釋放給作業系統,而是繼續持有以應對下一次PHP請求。這樣做大概是為了減少記憶體片段化或者解決從系統申請記憶體之後又釋放回作業系統所需要的時間不可控問題。可是如果偶然一次PHP請求使用了諸如ftp或者zlib這樣的大記憶體操作,那麼將導致一大塊系統記憶體被php-cgi持續佔有,不能被利用。
解決這個問題的辦法是在web伺服器配置中降低PHP_FCGI_MAX_REQUESTS的值。這個參數決定了一個php-cgi進程被建立出來之後,最多接受的PHP請求數,在lighttpd中預設配置是10000。也就是說這個php-cgi進程每接受10000次PHP請求後會終止,釋放所有記憶體,並重新被管理進程啟動。如果把它降低,比如改成100,那麼php-cgi重啟的周期會大大縮短,偶然的高記憶體操作造成的問題影響時間也會縮短。
另一個辦法則是寫一個crontab指令碼,定時發現高記憶體佔用的php-cgi進程並向它傳送kill指令。
我按照robbin配置的ruby on rails也發現了這個問題,起了10個進程,本來就不富裕的系統記憶體就沒了,搞的伺服器嗷嗷卡。現在將進程數降為5個,以觀後效。
愛J2EE關注Java邁克爾傑克遜視頻站JSON線上工具
http://biancheng.dnbcw.info/php/351503.html pageNo:3