PHP-FPM是什麼東東?

語言: CN / TW / HK

PHP-FPM 即 PHP FastCGI 程序管理器,要了解 PHP-FPM ,首先要看看 CGI 與 FastCGI 的關係。

CGI 的英文全名是 Common Gateway Interface,即通用閘道器介面,是 Web 伺服器呼叫外部程式時所使用的一種服務端應用的規範。

早期的 Web 通訊只是按照客戶端請求將儲存在 Web 伺服器硬碟中的資料轉發過去而已,這種情況下客戶端每次獲取的資訊也是同樣的內容(即靜態請求,比如圖片、樣式檔案、HTML文件),而隨著 Web 的發展,Web 所能呈現的內容更加豐富,與使用者的互動日益頻繁,比如部落格、論壇、電商網站、社交網路等。

這個時候僅僅通過靜態資源已經無法滿足 Web 通訊的需求,所以引入 CGI 以便客戶端請求能夠觸發 Web 伺服器執行另一個外部程式,客戶端所輸入的資料也會傳給這個外部程式,該程式執行結束後會將生成的 HTML 和其他資料通過 Web 伺服器再返回給客戶端(即動態請求,比如基於 PHP、Python、Java 實現的應用)。利用 CGI 可以針對使用者請求動態返回給客戶端各種各樣動態變化的資訊。

 

FastCGI 顧名思義,是 CGI 的升級版本,為了提升 CGI 的效能而生,CGI 針對每個 HTTP 請求都會 fork 一個新程序來進行處理(解析配置檔案、初始化執行環境、處理請求),然後把這個程序處理完的結果通過 Web 伺服器轉發給使用者,剛剛 fork 的新程序也隨之退出,如果下次使用者再請求動態資源,那麼 Web 伺服器又再次 fork 一個新程序,如此周而復始迴圈往復。

而 FastCGI 則會先 fork 一個 master 程序,解析配置檔案,初始化執行環境,然後再 fork 多個 worker 程序(與 Nginx 有點像),當 HTTP 請求過來時,master 程序將其會傳遞給一個 worker 程序,然後立即可以接受下一個請求,這樣就避免了重複的初始化操作,效率自然也就提高了。而且當 worker 程序不夠用時,master 程序還可以根據配置預先啟動幾個 worker 程序等著;當空閒 worker 程序太多時,也會關掉一些,這樣不僅提高了效能,還節約了系統資源。

這樣一來,PHP-FPM 就好理解了,FastCGI 只是一個協議規範,需要每個語言具體去實現,PHP-FPM 就是 PHP 版本的 FastCGI 協議實現,有了它,就是實現 PHP 指令碼與 Web 伺服器(通常是 Nginx)之間的通訊,同時它也是一個 PHP SAPI,從而構建起 PHP 直譯器與 Web 伺服器之間的橋樑。

 

PHP-FPM 負責管理一個程序池來處理來自 Web 伺服器的 HTTP 動態請求,在 PHP-FPM 中,master 程序負責與 Web 伺服器進行通訊,接收 HTTP 請求,再將請求轉發給 worker 程序進行處理,worker 程序主要負責動態執行 PHP 程式碼,處理完成後,將處理結果返回給 Web 伺服器,再由 Web 伺服器將結果傳送給客戶端。這就是 PHP-FPM 的基本工作原理,

PS:最大請求數:最大處理請求數是指一個php-fpm的worker程序在處理多少個請求後就終止掉,master程序會重新respawn一個新的。

這個配置的主要目的是避免php直譯器或程式引用的第三方庫造成的記憶體洩露。

pm.max_requests = 10240

以上內容希望幫助到大家,更多PHP大廠PDF面試文件,PHP進階架構視訊資料,PHP精彩好文免費獲取可以關注公眾號:PHP開源社群,或者訪問:

2021金三銀四大廠面試真題集錦,必看!

騰訊一面的Redis秒殺面試題你會麼?

四年精華PHP技術文章整理合集——PHP框架篇

四年精華PHP技術文合集——微服務架構篇

四年精華PHP技術文合集——分散式架構篇

四年精華PHP技術文合集——高併發場景篇

四年精華PHP技術文章整理合集——資料庫篇