最近有幸讀到一篇文章,一文將CGI 的進化史講的特別詳細,雖然我本身以前也整理過 CGI、FastCGI、PHP-FPM 相關的筆記,可是並無從原理的角度來認識 CGI。php
早些年的Web 應用很簡單,客戶端經過瀏覽器發起請求,服務端直接返回響應。nginx
隨着互聯網的發展,簡單的Web 應用已經不能知足開發者們了。
咱們但願Web服務器有更多的功能,飛速發展的同時還能讓不一樣語言的開發者也能加入。sql
CGI協議協議的誕生就是 Web服務器和其餘領域的開發者在保證遵照協議的基礎上,剩下的能夠自由發揮,而實現這個協議的腳本叫作CGI 程序。瀏覽器
CGI協議規定了須要向CGI腳本設置的環境變量和一些其餘信息,CGI程序完成某一個功能,能夠用PHP,Python,Shell或者C語言編寫。服務器
在沒有CGI 以前,其餘語言若是須要接入Mysql 或者Memcache,還須要使用C 語言,但有了CGI協議,咱們的Web處理流程能夠變成下圖這樣:socket
CGI程序存在致命的缺點:每當客戶端發起請求,服務器將請求轉發給CGI,WEB 服務器就請求操做系統生成一個新的CGI解釋器進程(如php-cgi),CGI進程則處理完一個請求後退出,下一個請求來時再建立新進程。php-fpm
咱們知道,執行一個PHP程序的必需要先解析php.ini
文件,而後模塊初始化等等一系列工做,每次都反覆這樣很是浪費資源。post
FastCGI協議在CGI協議的基礎上,作出了以下改變:spa
long-lived
)應用進程,減小了fork-and-execute
帶來的開銷咱們稱實現了FastCGI協議的程序爲FastCGI程序,FastCGI程序的交互方式以下圖所示:操作系統
FastCGI 程序當然已經很好了,但咱們的需求老是有點苛刻,它仍是存在一些明顯缺點的:
php.ini
)後,php-cgi
(FastCGI 程序) 沒法平滑重啓php-cgi
還沒作到上面說起php-cgi 實現的FastCGI問題官方沒有解決,幸運的是有第三方幫咱們解決了,它就是 php-fpm
。
它能夠獨立運行,不依賴php-cgi,換句話說,它本身實現了FastCGI協議而且支持進程平滑重啓且帶進程管理功能。