CGI全稱是「通用網關接口」(Common Gateway Interface), 它可讓一個客戶端,從網頁瀏覽器向執行在Web服務器上的程序請求數據。 CGI描述了客戶端和這個程序之間傳輸數據的一種標準。 CGI的一個目的是要獨立於任何語言的,因此CGI能夠用任何一種語言編寫,只要這種語言具備標準輸入、輸出和環境變量。 如php,perl,tcl等。php
FastCGI是Web服務器和處理程序之間通訊的一種協議, 是CGI的一種改進方案,FastCGI像是一個常駐(long-live)型的CGI, 它能夠一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI最爲人詬病的fork-and-execute模式)。 正是由於他只是一個通訊協議,它還支持分佈式的運算,即 FastCGI 程序能夠在網站服務器之外的主機上執行而且接受來自其它網站服務器來的請求。html
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,將CGI解釋器進程保持在內存中,以此得到較高的性能。 CGI程序反覆加載是CGI性能低下的主要緣由,若是CGI程序保持在內存中並接受FastCGI進程管理器調度, 則能夠提供良好的性能、伸縮性、Fail-Over特性等。數據庫
通常狀況下,FastCGI的整個工做流程是這樣的:api
- Web Server啓動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)
- FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的鏈接。
- 當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。 Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。
- FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時, 請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接。 在CGI模式中,php-cgi在此便退出了。
PHP的CGI實現了Fastcgi協議,是一個TCP或UDP協議的服務器接受來自Web服務器的請求, 當啓動時建立TCP/UDP協議的服務器的socket監聽,並接收相關請求進行處理。隨後就進入了PHP的生命週期: 模塊初始化,sapi初始化,處理PHP請求,模塊關閉,sapi關閉等就構成了整個CGI的生命週期。瀏覽器
以TCP爲例,在TCP的服務端,通常會執行這樣幾個操做步驟:服務器
- 調用socket函數建立一個TCP用的流式套接字;
- 調用bind函數將服務器的本地地址與前面建立的套接字綁定;
- 調用listen函數將新建立的套接字做爲監聽,等待客戶端發起的鏈接,當客戶端有多個鏈接鏈接到這個套接字時,可能須要排隊處理;
- 服務器進程調用accept函數進入阻塞狀態,直到有客戶進程調用connect函數而創建起一個鏈接;
- 當與客戶端建立鏈接後,服務器調用read_stream函數讀取客戶的請求;
- 處理完數據後,服務器調用write函數向客戶端發送應答。
PHP的FastCGI使你的全部php應用軟件經過mod_fastci運行,而不是mod_phpsusexec。FastCGI應用速度很快 是由於他們持久穩定,沒必要對每個請求都啓動和初始化。這使得應用程序的開發成爲可能,不然在CGI範例是不切實際的(例如一個大型的腳本,或者一個須要 鏈接單個或多個數據庫的應用)。架構
FastCGI的優勢:socket
- PHP腳本運行速度更快(3到30倍)。PHP解釋程序被載入內存而不用每次須要時從存儲器讀取,極大的提高了依靠腳本運行的站點的性能。
- 須要使用更少的系統資源。因爲服務器不用每次須要時都載入PHP解釋程序,你能夠將站點的傳輸速度提高很高而沒必要增長cpu負擔。
- 不須要對現有的代碼做任何改變。現有的一切都適用於PHP的FastCGI。
可是也會有潛在問題:分佈式
- 對全部的子目錄(/home/USERNAME/public_html/php.ini)你只有一個可用的php.ini文件。這是優 化網站代碼所必需的。若是你須要多個php.ini文件以適應不一樣的腳本須要,你能夠在任何子目錄禁用PHP的快速CGI,而其他的地方則繼續有效。若是 你須要這樣作請聯繫support。
- 你對PHP環境作的任何升級(如php.ini文件的改變)都有幾分鐘的延遲。這是由於爲了更快的速度你的php.ini文件已經被載入內存,而不是每次須要時再從存儲器從新讀取。