網關 php-cgi fastcgi phpfpm

本文同時發表在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的本質是:一個協議,包括了輸入請求,轉交,響應。服務器

image

可是CGI有一個明顯的問題:爲每條CGI請求引起一個新進程,這樣的開銷會限制那些使用CGI服務器的性能。因此出現了一種新型CGI——fastcgi。網絡

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

上面說的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

相關文章
相關標籤/搜索