分享之CGI、FastCGI 與 PHP-FPM (一)

cgi-fastcgi-phpfpm

PHP-FPM 的全稱是 PHP FastCGI Process Manager,即 PHP FastCGI 進程管理器,要了解 PHP-FPM ,首先要看看 CGI 與 FastCGI 的關係。php

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

這樣一來,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 的基本工做原理,網站

PHP-FPM 有本身獨立的配置文件 php-fpm.conf 用於對 PHP-FPM 進行配置,感興趣的能夠去看看。spa

相關文章
相關標籤/搜索