本文同時發表在https://github.com/zhangyachen/zhangyachen.github.io/issues/88php
關於網關的理解,一句話就是:做爲一種翻譯器,抽象出了一種可以到達資源的方法。git
這裏指的經過翻譯器來到達資源,能夠包括經過轉換協議(HTTP/FTP)獲取網關另外一端與客戶端使用不一樣協議的服務器的資源,也能夠包括經過網關向數據庫發送查詢語句來獲取動態數據,也能夠包括經過網關與不一樣的網絡進行通訊。總之就是經過網關獲取資源。github
理解了網關的宏觀概念以後,咱們看一下網關的分類:數據庫
以上的網關都是鏈接客戶端和服務器端的網關,即網關位於服務器和客戶端的中間。還有一種經常使用的網關,應用程序服務器,會將目標服務器與網關結合在一個服務器中實現。好比客戶端經過HTTP鏈接服務器,服務器將請求再經過一個網關應用編程接口發送給運行在服務器上的應用程序。編程
第一個流行的的應用程序網關API就是通用網關接口(Common Gateway Interface,CGI)。CGI是一個標準接口集。好比服務器須要請求網關的資源時,會將所須要的數據傳遞給它(一般是整條請求,包括url、查詢字符串、HTTP請求的header等)。以後網關向服務器返回響應數據,服務器再將數據返回給Client。安全
因此,CGI的本質是:一個協議,包括了輸入請求,轉交,響應。服務器
可是CGI有一個明顯的問題:爲每條CGI請求引起一個新進程,這樣的開銷會限制那些使用CGI服務器的性能。因此出現了一種新型CGI——fastcgi。網絡
Fastcgi接口模擬了CGI,可是是以持久守護進程運行的。首先,Fastcgi會先啓一個master,解析配置文件,初始化執行環境,而後再啓動多個worker。當請求過來時,master會傳遞給一個worker,而後當即能夠接受下一個請求。php-fpm
上面說的cgi與fastcgi都是協議,與特定語言無關的。性能
那麼php-cgi是什麼?網上主要有2種說法:
我的理解的是:php-cgi是php自帶的fastcgi管理器,管理的進程名稱是php-cgi,應該是湊巧名字同樣吧。
可是php-cgi的不足是:
綜上,誕生了php-fpm,也是一個實現了fastcgi協議的程序。PHP-FPM提供了更好的PHP進程管理方式,能夠有效控制內存和進程、能夠平滑重載PHP配置。
參考資料:如何通俗地解釋 CGI、FastCGI、php-fpm 之間的關係?
概念瞭解:CGI,FastCGI,PHP-CGI與PHP-FPM HTTP權威指南8.1 8.2 8.3