CGI、FastCGI、PHP-CGI和PHP-FPM 概念區分

在路上發表於2019-02-16

CGI

簡介

CGI全稱是通用閘道器介面(Common Gateway Interface),是外部應用程式與與伺服器之間的介面標準,是在CGI程式和web伺服器之間傳遞資訊的規程。

在物力層面上、CGI是一段程式,執行在伺服器上。

CGI可以用任意語言編寫,主要這種語言具有標準輸入、輸出和環境變數

FastCGI

簡介

FastCGI是一個可伸縮地、高速地在HTTP server和動態指令碼語言間通訊的介面。多數流行的HTTP server都支援FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多指令碼語言所支援,其中就有PHP。

FastCGI是從CGI發展改進而來的。傳統CGI介面方式的主要缺點是效能很差,因為每次HTTP伺服器遇到動態程式時都需要重新啟動指令碼解析器來執行解析,然後結果被返回給HTTP伺服器。這在處理高併發訪問時,幾乎是不可用的。另外傳統的CGI介面方式安全性也很差,現在已經很少被使用了。

FastCGI介面方式採用C/S結構,可以將HTTP伺服器和指令碼解析伺服器分開,同時在指令碼解析伺服器上啟動一個或者多個指令碼解析守護程式。當HTTP伺服器每次遇到動態程式時,可以將其直接交付給FastCGI程式來執行,然後將得到的結果返回給瀏覽器。這種方式可以讓HTTP伺服器專一地處理靜態請求或者將動態指令碼伺服器的結果返回給客戶端,這在很大程度上提高了整個應用系統的效能。

原理

  1. Web Server啟動時載入FastCGI程式管理器(IIS ISAPI或Apache Module)

  2. FastCGI程式管理器自身初始化,啟動多個CGI直譯器程式(可見多個php-cgi)並等待來自Web Server的連線。

  3. 當客戶端請求到達Web Server時,FastCGI程式管理器選擇並連線到一個CGI直譯器。Web server將CGI環境變數和標準輸入傳送到FastCGI子程式php-cgi。

  4. FastCGI子程式完成處理後將標準輸出和錯誤資訊從同一連線返回Web Server。當FastCGI子程式關閉連線時,請求便告處理完成。FastCGI子程式接著等待並處理來自FastCGI程式管理器(執行在Web Server中)的下一個連線。 在CGI模式中,php-cgi在此便退出了。

PHP-CGI

簡介

PHP-CGI是php自帶的Fast-CGI管理器。

PHP-CGI的不足:

  1. php-cgi變更php.ini配置後需重啟php-cgi才能讓新的php-ini生效,不可以平滑重啟。

  2. 直接殺死php-cgi程式,php就不能執行了。(PHP-FPM和Spawn-FCGI就沒有這個問題,守護程式會平滑從新生成新的子程式。)

PHP-FPM

簡介

  1. PHP-FPM是一個PHP FastCGI的管理器,他是能夠排程php-cgi程式的程式。

  2. 修改php.ini之後,php-cgi程式的確沒辦法平滑重啟,但php-fpm對此的應對方法是新的程式用新的配置,已經存在的程式讓按照之前的配置執行到結束。用這種方式進行平滑過渡。

  3. PHP-fpm就是針對於PHP的,Fastcgi的一種實現,他負責管理一個程式池,來處理來自Web伺服器的請求。目前,PHP-fpm是內建於PHP的

相關文章