CGI全程「通用網關接口」,它可讓一個客戶端從網頁瀏覽器向執行在Web服務器上的程序請求數據,CGI描述了客戶端和這個程序之間傳輸數據的一種標準。php
FastCGI是Web服務器和處理程序之間通訊的一種協議,是CGI的一種改進,FastCGI相似一個常駐性的CGI,它能夠一直執行,在請求到達時不會花費時間去fork一個進程進來處理。由於他只是一個通訊協議,且支持分佈式的運算,即FastCGI程序能夠在網站服務器之外的主機上執行並接受且接受來自其餘網站服務器的請求。api
FastCGI是與語言無關的、可伸縮架構的CGI開發擴展,將CGI解釋器進程保持在內存當中,能夠得到較高的性能。CGI程序反覆加載是CGI性能地下的主要緣由,若是CGI程序保持在內存中並接收FastCGI進程管理器的調度,則能夠提供良好的性能、伸縮性等。瀏覽器
FastCGI大體工做流程:服務器
①Web Service在啓動時加載FastCGI進程管理器;架構
②FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Service的鏈接;socket
③當客戶端請求到達Web Service時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web Service 將CGI環境變量和標準輸入發送到FastCGI進程php-cgi分佈式
④FastCGI子進程完成處理後將標準輸出和錯誤信息從同一個鏈接返回Web Service,當FastCGI子進程關閉鏈接時,請求便處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器的下一個鏈接。函數
PHP中的CGI實現:性能
PHP的CGI實現了FastCGI協議,是一個TCP或UDP協議的服務器接收來自Web服務器的請求,當啓動時建立TCP/UDP協議的服務器的socket監聽,並接收相關請求進行處理。隨後進入PHP的生命週期:模塊初始化、sapi初始化、處理PHP請求、模塊關閉、sapi關閉等。網站
以TCP爲例,在TCP的服務店,通常會執行的幾個操做步驟:
①調用socket函數建立一個TCP用的流式套接字;
②調用bind函數將服務器的本地地址與前面建立的套接字綁定;
③調用listen函數建立新的套接字做爲監聽,等待客戶端發起的鏈接,當客戶端有多個鏈接鏈接到這個套接字時,可能須要排隊處理;
④服務器進程調用accept函數進入阻塞狀態,直到有客戶進程調用connect函數從而創建以一個鏈接;
⑤當與客戶端建立鏈接後,服務器調用red_stream函數讀取客戶的請求;
⑥處理完數據後,服務器調用weite函數向客戶端發送應答。