標籤:fastcgi
CGI全稱是“通用閘道介面”(Common Gateway Interface), 它可以讓一個用戶端,從網頁瀏覽器向執行在Web伺服器上的程式請求資料。 CGI描述了用戶端和這個程式之間傳輸資料的一種標準。 CGI的一個目的是要獨立於任何語言的,所以CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。 如php,perl,tcl等。
FastCGI是Web伺服器和處理常式之間通訊的一種協議, 是CGI的一種改進方案,FastCGI像是一個常駐(long-live)型的CGI, 它可以一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI最為人詬病的fork-and-execute模式)。 正是因為他只是一個通訊協定,它還支援分布式的運算,即 FastCGI 程式可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴充,將CGI解譯器進程保持在記憶體中,以此獲得較高的效能。 CGI程式反覆載入是CGI效能低下的主要原因,如果CGI程式保持在記憶體中並接受FastCGI進程管理器調度, 則可以提供良好的效能、伸縮性、Fail-Over特性等。
一般情況下,FastCGI的整個工作流程是這樣的:
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函數向用戶端發送應答。
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/9C/58/wKioL1lvITny3yP5AADb6FTON_s288.jpg-wh_651x-s_4165406538.jpg" width="651" height="745" alt="wKioL1lvITny3yP5AADb6FTON_s288.jpg-wh_65" />
PHP的FastCGI使你的所有php應用軟體通過mod_fastci運行,而不是mod_phpsusexec。FastCGI應用速度很快是因為他們持久穩定,不必對每一個請求都啟動和初始化。這使得應用程式的開發成為可能,否則在CGI範例是不切實際的(例如一個大型的指令碼,或者一個需要 串連單個或多個資料庫的應用)。
FastCGI的優點:
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檔案已經被載入記憶體,而不是每次需要時再從儲存空間重新讀取。
PHP的FastCGI