CGI、PHP-CGI、FastCGI

CGI

一. CGI是什麼
CGI,全稱是Common Gateway Interface,翻譯過來就是「通用網關接口」,定義了一個接口標準,描述了數據怎麼在服務器和外部應用程序之間怎麼傳遞。php

二. CGI的來歷
在很早以前,互聯網只有些靜態內容,瀏覽器發送資源請求,服務器接受請求並返回服務器上的靜態文件便可。數據庫

隨着互聯網的發展,動態內容產生了,這些動態內容涉及到了數據庫,可以操做數據庫的動態語言將數據處理後返回給WebServer,WebServer再返回給瀏覽器。編程

因爲有不少種動態語言和不少種瀏覽器,它們之間面臨着不兼容的狀況,這時候就須要在它們之間設立一個接口標準,這就是CGI。瀏覽器發起請求,WebServer會將請求發給對應的CGI程序,CGI再調用外部程序來處理請求並返回結果。瀏覽器

Paste_Image.png

三. CGI的做用
WebServer是經過以下方式來CGI程序進行通訊的,因此只要支持標準輸入輸出和環境變量的語言,都能用來編寫CGI程序。服務器

環境變量(請求類型,請求IP..)
標準輸入(請求主體)
標準輸出(請求響應)

CGI描述瞭如何在環境變量中傳遞請求的基本信息,如何經過標準輸入傳遞請求體,以及如何經過標準輸出來傳遞輸出。這就使編程語言能夠很容易得使用環境變量、標準輸入輸出架構

四. CGI的缺點
WebServer在接收到請求時,會先fork出CGI進程,而後處理請求,處理完後結束這個進程,這就是 fork-and-execute 模式。因此用 CGI 方式的服務器有多少鏈接請求就會有多少 CGI 進程,每一個進程都會加載解析PHP配置,初始化執行環境,那麼當高併發請求時,會大量擠佔系統的資源如內存,CPU 時間等,形成效能低下。併發

PHP-CGI

PHP-CGI是php的CGI程序,不進行進程管理編程語言

FastCGI

一. FastCGI的簡介
FastCGI是Web服務器和處理程序之間通訊的一種協議, 是CGI的一種改進方案,FastCGI像是一個常駐(long-lived)型的CGI, 它能夠一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI最爲人詬病的fork-and-execute模式)。 正是由於他只是一個通訊協議,它還支持分佈式的運算,因此 FastCGI 程序能夠在網站服務器之外的主機上執行,而且能夠接受來自其它網站服務器的請求。分佈式

FastCGI 是與語言無關的、可伸縮架構的 CGI 開放擴展,將 CGI 解釋器進程保持在內存中,以此得到較高的性能。 CGI 程序反覆加載是 CGI 性能低下的主要緣由,若是 CGI 程序保持在內存中並接受 FastCGI 進程管理器調度, 則能夠提供良好的性能、伸縮性、Fail-Over 特性等。高併發

二. FastCGI工做流程

  1. FastCGI 進程管理器自身初始化,啓動多個 CGI 解釋器進程,並等待來自 Web Server 的鏈接。
  2. Web 服務器與 FastCGI 進程管理器進行 Socket 通訊,經過 FastCGI 協議發送 CGI 環境變量和標準輸入數據給 CGI 解釋器進程。
  3. CGI 解釋器進程完成處理後將標準輸出和錯誤信息從同一鏈接返回 Web Server。
  4. CGI 解釋器進程接着等待並處理來自 Web Server 的下一個鏈接。

FastCGI 與傳統 CGI 模式的區別之一則是 Web 服務器不是直接執行 CGI 程序了,而是經過 Socket 與 FastCGI 響應器(FastCGI 進程管理器)進行交互,也正是因爲 FastCGI 進程管理器是基於 Socket 通訊的,因此也是分佈式的,Web 服務器能夠和 CGI 響應器服務器分開部署。Web 服務器須要將數據 CGI/1.1 的規範封裝在遵循 FastCGI 協議包中發送給 FastCGI 響應器程序。

相關文章
相關標籤/搜索