PHP記憶體流失詳解

來源:互聯網
上載者:User
記憶體流失指的是在程式運行過程中申請了記憶體,但是在使用完成後沒有及時釋放的現象, 對於普通已耗用時間較短的程式來說可能問題不會那麼明顯,但是對於長時間啟動並執行程式, 比如Web伺服器,後台進程等就比較明顯了,隨著系統運行佔用的記憶體會持續上升, 可能會因為佔用記憶體過高而崩潰,或被系統殺掉(OOM)。

PHP的記憶體流失

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

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

PHP-FPM造成的記憶體流失

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

  1. nginx伺服器fork出n個子進程(worker),php-fpm管理器fork出n個子進程。

  2. 當有使用者請求,nginx的一個worker接收請求,並將請求拋到socket中。

  3. php-fpm閒置子進程監聽到socket中有請求,接收並處理請求。

這裡要重點說一下第三步驟。第三步涉及到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記憶體流失分析。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.