天天看點

淺析CGI、FastCGI、PHP-FPM、PHP-CGI

一、CGI(通用網關接口)

CGI 是Web 伺服器運作時外部程式的規範标準(一種協定),按CGI 編寫的程式可以擴充伺服器功能。

CGI應用程式是獨立于伺服器的,是以說幾乎所有伺服器都支援CGI,可用任何語言編寫實作CGI(隻要這種語言具有标準輸入、輸出和環境變量)。

CGI是外部應用程式(CGI程式)與WEB伺服器之間的接口标準,是在CGI程式和Web伺服器之間傳遞資訊的過程。

工作流程:我們說Internet把使用者請求送到web伺服器->web伺服器接收使用者請求并交給CGI程式處理->CGI程式 把處理結果傳送給web伺服器->web伺服器把結果送回到使用者。

舉個例子:

比如,使用者請求

index.html

,那麼web server會去檔案系統中找到這個檔案,發送給浏覽器,這裡分發的是靜态資料。如果現在請求的是

index.php

,根據配置檔案,nginx知道這個不是靜态檔案,需要去找PHP解釋器來處理,那麼他會把這個請求簡單處理後交給PHP解釋器。Nginx會傳哪些資料給PHP解釋器呢?url、查詢字元串、POST資料、HTTP header等,那麼CGI就是規定要傳哪些資料、以什麼樣的格式傳遞給後方處理這個請求的協定。

當web server收到

index.php

這個請求後,會啟動對應的CGI程式,這裡就是PHP的解釋器。接下來PHP解釋器會解析php.ini檔案,初始化執行環境,然後處理請求,再以規定CGI規定的格式傳回處理後的結果,退出程序。web server再把結果傳回給浏覽器。

二、FastCGI

CGI是第一個,可能仍然是得到最廣泛使用的伺服器擴充。它在伺服器和衆多的資源類型之間提供了一種簡單的、函數形式的粘合方式,用來處理各種需要的轉換。這個接口還能很好的保護伺服器,防止一些糟糕的擴充對它造成的破壞。但是CGI也存在着非常大的缺陷,就是每當使用CGI的伺服器接受得到一個請求都會開啟一個新的CGI程序進行處理(PHP中需要重新解析php.ini,重新載入全部擴充并且初始化全部資料結構),這對伺服器的性能有着極大的消耗。為了解決這個問題,就誕生了一種新型的CGI---FastCGI,FastCGI像是一個常駐型的CGI,是作為持久守護程序運作的,很好的解決了這個問題。

注:它還支援分布式的運算, 即 FastCGI 程式可以在網站伺服器以外的主機上執行并且接受來自其它網站伺服器來的請求。

其主要行為是:将CGI解釋器程序保持在記憶體中并是以獲得較高的性能。

工作原理:

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-FPM、PHP-CGI

大家都知道,PHP的解釋器是PHP-CGI。PHP-CGI隻是個CGI程式,他自己本身隻能解析請求,傳回結果,不會程序管理,是以就出現了一些能夠排程PHP-CGI程序的程式,PHP-FPM就是經過多年實驗和使用并被PHP官方收納的這樣的程式。

而PHP-fpm就是針對于PHP的,Fastcgi的一種實作,他負責管理一個程序池,來處理來自Web伺服器的請求。

資料來源:HTTP權威指南

               百度百科

               https://segmentfault.com/q/1010000000256516