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 的基本工作原理。
參考自《不定期分享之 CGI、FastCGI 與 PHP-FPM 的前世今生》
作者:郁冬
出處:http://www.cnblogs.com/lamp01/
本文版權歸作者和部落格園共有,如需轉載,請注明出處。