一. CGI是什麼
CGI,全稱是Common Gateway Interface,翻譯過來就是「通用網關接口」,定義了一個接口標準,描述了數據怎麼在服務器和外部應用程序之間怎麼傳遞。php
二. CGI的來歷
在很早以前,互聯網只有些靜態內容,瀏覽器發送資源請求,服務器接受請求並返回服務器上的靜態文件便可。數據庫
隨着互聯網的發展,動態內容產生了,這些動態內容涉及到了數據庫,可以操做數據庫的動態語言將數據處理後返回給WebServer,WebServer再返回給瀏覽器。編程
因爲有不少種動態語言和不少種瀏覽器,它們之間面臨着不兼容的狀況,這時候就須要在它們之間設立一個接口標準,這就是CGI。瀏覽器發起請求,WebServer會將請求發給對應的CGI程序,CGI再調用外部程序來處理請求並返回結果。瀏覽器
三. CGI的做用
WebServer是經過以下方式來CGI程序進行通訊的,因此只要支持標準輸入輸出和環境變量的語言,都能用來編寫CGI程序。服務器
環境變量(請求類型,請求IP..)
標準輸入(請求主體)
標準輸出(請求響應)
CGI描述瞭如何在環境變量中傳遞請求的基本信息,如何經過標準輸入傳遞請求體,以及如何經過標準輸出來傳遞輸出。這就使編程語言能夠很容易得使用環境變量、標準輸入輸出架構
四. CGI的缺點
WebServer在接收到請求時,會先fork出CGI進程,而後處理請求,處理完後結束這個進程,這就是 fork-and-execute 模式。因此用 CGI 方式的服務器有多少鏈接請求就會有多少 CGI 進程,每一個進程都會加載解析PHP配置,初始化執行環境,那麼當高併發請求時,會大量擠佔系統的資源如內存,CPU 時間等,形成效能低下。併發
PHP-CGI是php的CGI程序,不進行進程管理編程語言
一. FastCGI的簡介
FastCGI是Web服務器和處理程序之間通訊的一種協議, 是CGI的一種改進方案,FastCGI像是一個常駐(long-lived)型的CGI, 它能夠一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI最爲人詬病的fork-and-execute模式)。 正是由於他只是一個通訊協議,它還支持分佈式的運算,因此 FastCGI 程序能夠在網站服務器之外的主機上執行,而且能夠接受來自其它網站服務器的請求。分佈式
FastCGI 是與語言無關的、可伸縮架構的 CGI 開放擴展,將 CGI 解釋器進程保持在內存中,以此得到較高的性能。 CGI 程序反覆加載是 CGI 性能低下的主要緣由,若是 CGI 程序保持在內存中並接受 FastCGI 進程管理器調度, 則能夠提供良好的性能、伸縮性、Fail-Over 特性等。高併發
二. FastCGI工做流程
FastCGI 與傳統 CGI 模式的區別之一則是 Web 服務器不是直接執行 CGI 程序了,而是經過 Socket 與 FastCGI 響應器(FastCGI 進程管理器)進行交互,也正是因爲 FastCGI 進程管理器是基於 Socket 通訊的,因此也是分佈式的,Web 服務器能夠和 CGI 響應器服務器分開部署。Web 服務器須要將數據 CGI/1.1 的規範封裝在遵循 FastCGI 協議包中發送給 FastCGI 響應器程序。