CGI即通用網關接口,是 Web 服務器調用外部程序時所使用的一種服務端應用的規范。
早期的 Web 通信請求的都是靜態數據,比如圖片、Html文檔等,隨着Web的發展,靜態網站已經不能滿足人們的需要,所以引入 CGI 以便客戶端請求能夠觸發 Web 服務器運行另一個外部程序,客戶端所輸入的數據也會傳給這個外部程序,該程序運行結束后會將生成的 HTML 和其他數據通過 Web 服務器再返回給客戶端,利用 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 的基本工作原理。