記憶體洩漏指的是在程式執行過程中申請了記憶體,但是在使用完成後沒有及時釋放的現象, 對於普通執行時間較短的程式來說可能問題不會那麼明顯,但是對於長時間執行的程式, 比如web伺服器,後台程序等就比較明顯了,隨著系統執行占用的記憶體會持續上公升, 可能會因為占用記憶體過高而崩潰,或被系統殺掉。
這裡先簡單說一下nginx+php-fpm模式的工作原理:
第三步涉及到php-fpm程序生命週期的東西。
乙個php-fpm的生命週期大致是這樣的:
模組初始化(minit)
-> 模組啟用(rinit)
-> 請求處理
-> 模組停用(rshutdown)
-> 模組啟用(rinit)
-> 請求處理
-> 模組停用(rshutdown)
-> 模組啟用(rinit)
-> 請求處理
-> 模組停用(rshutdown)
-> 模組關閉(mshutdown)。
在乙個php-fpm程序的生命週期裡,會有多次的模組啟用(rinit)-> 請求處理 -> 模組停用(rshutdown)的過程。
這個「請求處理」的大致過程是這樣的:
php讀取相應的php檔案,對其進行詞法分析,生成opcode,zend虛擬機器執行opcode。
php配置檔案裡面的memory_limit 這個東西,其實,它限制的只是這個「請求處理」的記憶體。
所以,這個引數跟php-fpm程序占用的記憶體並沒有什麼關係。
php是用c寫的,所以,難免又會一些記憶體洩露。也就是說,在「請求處理」這個過程結束後,有些變數沒有被銷毀,然後就導致乙個php-fpm程序占用的記憶體越來越大。
那麼,有什麼辦法能阻止這個問題呢?
php-fpm.conf中有個引數pm.max_requests,等同於php_fcgi_max_requests。該值的意思是乙個fpm程序處理多少個請求後自動殺掉另起新程序。
這個引數預設是關閉的,我們需要開啟這個引數,並且適當降低這個值,用以讓php-fpm自動的釋放記憶體。
另乙個跟它有關聯的值max_children,這個是每次php-fpm會建立多少個程序,這樣實際上的記憶體消耗是max_children*max_requests*每個請求使用記憶體,根據這個我們可以預估一下記憶體的使用情況,就不用再寫指令碼去kill了。
function test1()
}
PHP記憶體洩漏
如果php物件存在遞迴引用,就會出現記憶體洩漏。這個bug在php裡已經存在很久很久了,先讓我們來重現這個bug,如下 class foo class bar for i 0 i 100 i 執行以上 你會發現,記憶體使用量本應該不變才對,可實際上卻是不斷增加,unset沒有完全生效。現在的開發很多...
7 php 記憶體洩漏 PHP 記憶體管理
php 的記憶體管理來自於 zend 引擎。php 的記憶體管理與預防記憶體洩漏緊密關聯。有關執行緒內全域性資料處理的資訊請參見作為執行緒隔離設施的執行緒安全的資源管理器。此外,zend 引擎要面對乙個十分特殊的使用模式 在一段比較短的時間內,許多 zval 結構大小的記憶體塊和其他的小記憶體塊被申...
記憶體洩漏和記憶體溢位 記憶體洩漏和記憶體溢位
記憶體洩漏 是指申請的記憶體空間使用完畢之後未 一次記憶體洩露危害可以忽略,但若一直洩漏,無論有多少記憶體,遲早都會被占用光,最終導致程式crash。因此,開發中我們要盡量避免記憶體洩漏的出現 記憶體溢位 是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用。通俗理解就是記憶體不夠用了,通常在執行大...