CGI全稱是“通用網(wǎng)關(guān)接口”(Common Gateway Interface), 它可以讓一個客戶端,從網(wǎng)頁瀏覽器向執(zhí)行在Web服務(wù)器上的程序請求數(shù)據(jù)。 CGI描述了客戶端和這個程序之間傳輸數(shù)據(jù)的一種標準。 CGI的一個目的是要獨立于任何語言的,所以CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環(huán)境變量。 如php,perl,tcl等。
FastCGI是Web服務(wù)器和處理程序之間通信的一種協(xié)議, 是CGI的一種改進方案,F(xiàn)astCGI像是一個常駐(long-live)型的CGI, 它可以一直執(zhí)行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI最為人詬病的fork-and-execute模式)。 正是因為他只是一個通信協(xié)議,它還支持分布式的運算,即 FastCGI 程序可以在網(wǎng)站服務(wù)器以外的主機上執(zhí)行并且接受來自其它網(wǎng)站服務(wù)器來的請求。
FastCGI是語言無關(guān)的、可伸縮架構(gòu)的CGI開放擴展,將CGI解釋器進程保持在內(nèi)存中,以此獲得較高的性能。 CGI程序反復(fù)加載是CGI性能低下的主要原因,如果CGI程序保持在內(nèi)存中并接受FastCGI進程管理器調(diào)度, 則可以提供良好的性能、伸縮性、Fail-Over特性等。
一般情況下,F(xiàn)astCGI的整個工作流程是這樣的:
Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)
FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)并等待來自Web Server的連接。
當客戶端請求到達Web Server時,F(xiàn)astCGI進程管理器選擇并連接到一個CGI解釋器。 Web server將CGI環(huán)境變量和標準輸入發(fā)送到FastCGI子進程php-cgi。
FastCGI子進程完成處理后將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關(guān)閉連接時, 請求便告處理完成。FastCGI子進程接著等待并處理來自FastCGI進程管理器(運行在Web Server中)的下一個連接。 在CGI模式中,php-cgi在此便退出了。
PHP的CGI實現(xiàn)了Fastcgi協(xié)議,是一個TCP或UDP協(xié)議的服務(wù)器接受來自Web服務(wù)器的請求, 當啟動時創(chuàng)建TCP/UDP協(xié)議的服務(wù)器的socket監(jiān)聽,并接收相關(guān)請求進行處理。隨后就進入了PHP的生命周期: 模塊初始化,sapi初始化,處理PHP請求,模塊關(guān)閉,sapi關(guān)閉等就構(gòu)成了整個CGI的生命周期。
以TCP為例,在TCP的服務(wù)端,一般會執(zhí)行這樣幾個操作步驟:
調(diào)用socket函數(shù)創(chuàng)建一個TCP用的流式套接字;
調(diào)用bind函數(shù)將服務(wù)器的本地地址與前面創(chuàng)建的套接字綁定;
調(diào)用listen函數(shù)將新創(chuàng)建的套接字作為監(jiān)聽,等待客戶端發(fā)起的連接,當客戶端有多個連接連接到這個套接字時,可能需要排隊處理;
服務(wù)器進程調(diào)用accept函數(shù)進入阻塞狀態(tài),直到有客戶進程調(diào)用connect函數(shù)而建立起一個連接;
當與客戶端創(chuàng)建連接后,服務(wù)器調(diào)用read_stream函數(shù)讀取客戶的請求;
處理完數(shù)據(jù)后,服務(wù)器調(diào)用write函數(shù)向客戶端發(fā)送應(yīng)答。
PHP的FastCGI使你的所有php應(yīng)用軟件通過mod_fastci運行,而不是mod_phpsusexec。FastCGI應(yīng)用速度很快是因為他們持久穩(wěn)定,不必對每一個請求都啟動和初始化。這使得應(yīng)用程序的開發(fā)成為可能,否則在CGI范例是不切實際的(例如一個大型的腳本,或者一個需要 連接單個或多個數(shù)據(jù)庫的應(yīng)用)。
FastCGI的優(yōu)點:
PHP腳本運行速度更快(3到30倍)。PHP解釋程序被載入內(nèi)存而不用每次需要時從存儲器讀取,極大的提升了依靠腳本運行的站點的性能。
需要使用更少的系統(tǒng)資源。由于服務(wù)器不用每次需要時都載入PHP解釋程序,你可以將站點的傳輸速度提升很高而不必增加cpu負擔。
不需要對現(xiàn)有的代碼作任何改變?,F(xiàn)有的一切都適用于PHP的FastCGI。
但是也會有潛在問題:
對所有的子目錄(/home/USERNAME/public_html/php.ini)你只有一個可用的php.ini文件。這是優(yōu)化網(wǎng)站代碼所必需的。如果你需要多個php.ini文件以適應(yīng)不同的腳本需要,你可以在任何子目錄禁用PHP的快速CGI,而其余的地方則繼續(xù)有效。如果你需要這樣做請聯(lián)系support。
你對PHP環(huán)境做的任何升級(如php.ini文件的改變)都有幾分鐘的延遲。這是因為為了更快的速度你的php.ini文件已經(jīng)被載入內(nèi)存,而不是每次需要時再從存儲器重新讀取。
我們專注高端建站,小程序開發(fā)、軟件系統(tǒng)定制開發(fā)、BUG修復(fù)、物聯(lián)網(wǎng)開發(fā)、各類API接口對接開發(fā)等。十余年開發(fā)經(jīng)驗,每一個項目承諾做到滿意為止,多一次對比,一定讓您多一份收獲!