1. 程式人生 > >網關 php-cgi fastcgi phpfpm

網關 php-cgi fastcgi phpfpm

參考資料 過濾 個人 網絡協議 mas 出現 http請求 api iss

本文同時發表在https://github.com/zhangyachen/zhangyachen.github.io/issues/88

關於網關的理解,一句話就是:作為一種翻譯器,抽象出了一種能夠到達資源的方法。

這裏指的通過翻譯器來到達資源,可以包括通過轉換協議(HTTP/FTP)獲取網關另一端與客戶端使用不同協議的服務器的資源,也可以包括通過網關向數據庫發送查詢語句來獲取動態數據,也可以包括通過網關與不同的網絡進行通信。總之就是通過網關獲取資源。

理解了網關的宏觀概念之後,我們看一下網關的分類:

  • 協議網關:在不同協議的網絡之間的協議轉換。
  • 應用網關:將某個服務的一種數據格式轉化為該服務的另外一種數據格式,從而實現數據交流。例如兩個擁有不同電子郵件協議的主機要通過電子郵件網關進行互相通信。
  • 安全網關:最常用的安全網關就是包過濾器,實際上就是對數據包的原地址,目的地址和端口號,網絡協議進行授權。通過對這些信息的過濾處理,讓有許可權的數據包傳輸通過網關,而對那些沒有許可權的數據包進行攔截甚至丟棄。

以上的網關都是連接客戶端和服務器端的網關,即網關位於服務器和客戶端的中間。還有一種常用的網關,應用程序服務器,會將目標服務器與網關結合在一個服務器中實現。比如客戶端通過HTTP連接服務器,服務器將請求再通過一個網關應用編程接口發送給運行在服務器上的應用程序。

第一個流行的的應用程序網關API就是通用網關接口(Common Gateway Interface,CGI)。CGI是一個標準接口集

。比如服務器需要請求網關的資源時,會將所需要的數據傳遞給它(通常是整條請求,包括url、查詢字符串、HTTP請求的header等)。之後網關向服務器返回響應數據,服務器再將數據返回給Client。

所以,CGI的本質是:一個協議,包括了輸入請求,轉交,響應。

技術分享圖片

但是CGI有一個明顯的問題:為每條CGI請求引發一個新進程,這樣的開銷會限制那些使用CGI服務器的性能。所以出現了一種新型CGI——fastcgi。

Fastcgi接口模擬了CGI,但是是以持久守護進程運行的。首先,Fastcgi會先啟一個master,解析配置文件,初始化執行環境,然後再啟動多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。

上面說的cgi與fastcgi都是協議,與特定語言無關的。

那麽php-cgi是什麽?網上主要有2種說法:

  • PHP的解釋器是php-cgi,php-cgi只是個CGI程序,不會進行進程管理。
  • PHP-CGI是PHP自帶的FastCGI管理器。

個人理解的是:php-cgi是php自帶的fastcgi管理器,管理的進程名稱是php-cgi,應該是湊巧名字一樣吧。

但是php-cgi的不足是:

  • php-cgi變更php.ini配置後需重啟php-cgi才能讓新的php.ini生效,不可以平滑重啟。
  • 直接殺死php-cgi進程,php就不能運行了。(PHP-FPM沒有這個問題,守護進程會平滑重新生成新的子進程。)

綜上,誕生了php-fpm,也是一個實現了fastcgi協議的程序。PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置。

參考資料:如何通俗地解釋 CGI、FastCGI、php-fpm 之間的關系?
概念了解:CGI,FastCGI,PHP-CGI與PHP-FPM
HTTP權威指南8.1 8.2 8.3

網關 php-cgi fastcgi phpfpm