PHP記憶體洩漏詳解

小云云
發布: 2023-03-21 21:58:01
原創
5261 人瀏覽過

內存洩漏指的是在程序運行過程中申請了內存,但是在使用完成後沒有及時釋放的現象, 對於普通運行時間較短的程序來說可能問題不會那麼明顯,但是對於長時間運行的程序, 例如Web伺服器,後台進程等就比較明顯了,隨著系統運行佔用的記憶體會持續上升, 可能會因為佔用記憶體過高而崩潰,或被系統殺掉(OOM)。

PHP的記憶體洩漏

PHP屬於高階語言,語言層級並沒有記憶體的概念,在使用過程中完全不需要主動申請或釋放內存, 所以在PHP使用者程式碼層級也就不存在記憶體洩漏的概念了。

如果你的PHP程式記憶體洩漏了,要嘛是沒有及時釋放大變數、那麼就是第三方擴充本身實作有問題。

PHP-FPM造成的記憶體洩漏

##這裡先簡單說一下nginx+php-fpm模式的工作原理:

    ##nginx伺服器fork出n個子程序(worker),php-fpm管理器fork出n個子程序。
  1. 當有使用者請求,nginx的一個worker接收請求,並將請求拋到socket。
  2. php-fpm空閒的子程序監聽到socket中有請求,接收並處理請求。
  3. 這裡要重點說一下第三步。第三步涉及到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-fpm.conf中有個參數pm.max_requests,等同於PHP_FCGI_MAX_REQUESTS。該值的意思是一個fpm程序處理多少個請求後自動殺掉另起新進程。


記憶體洩漏的debug及工具

記憶體洩漏的程式通常很容易發現,因為症狀都表現為記憶體佔用的持續成長, 在發現記憶體持續成長後我們需要判斷是什麼導致了記憶體洩漏,這時往往需要藉助一些工具來幫助追查,我們可以用到兩個工具:PHP內建記憶體洩漏偵測及valgrind記憶體洩漏分析。

相關建議:

JavaScript記憶體洩漏的處理方式實例分享

PHP核心-記憶體洩漏與新垃圾回收機制的圖文介紹

什麼是記憶體洩漏以及記憶體洩漏發生的原因和防止方法

以上是PHP記憶體洩漏詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板