CGI,FastCGI與PHP

CGI

什麼是CGI
CGI(Common Gateway Interface)是一個標準協議,它爲web服務器提供了一個標準的協議,以便於服務器能夠像運行命令行接口程序那樣來運行第三方程序,這些第三方程序能夠動態地生成web頁面。這些第三方程序被稱爲CGI腳本(知足CGI定義的程序),或者簡稱CGIs。至於這些CGI程序是如何被執行的則是由服務器決定的。在通常狀況下,CGI腳本在接收到web請求能動態地生成HTML。 php

爲何會有CGI
正如瀏覽器會將請求信息發送給web服務器,web服務器在須要CGI程序時也會將一些必要的信息傳遞給CGI程序。相應的,當CGI程序運行完後也須要將一些信息返回給web服務器,這些信息包括了http相應中的一些內容,例如:當前請求的響應狀態,返回的內容類型(e.g. HTML, PDF, or plain text)等等。 html

在很早以前,不一樣的web服務器會使用不一樣的方法去跟CGI程序交換信息,這使得CGI程序的通用性不強(根據不一樣的web服務器須要相應的修改CGI程序)。所以CGI誕生了,它定義了一些通用的方法的來規範web服務器和CGI程序之間的信息交流。早期CGI程序主要被用來處理HTML表單。nginx

webserver與CGI程序的鏈接
在web服務器中每每能夠配置哪些url須要被CGI程序來處理。這一般是經過規定服務器某些目錄是屬於CGI程序的(這個目錄對應着某種形式的url,例如「http://example.com/cgi-bin/pr...」這個url對應着cgi-bin這個目錄,所以服務器知道這個請求須要被CGI程序來處理)web

web服務器經過將必要的信息存儲在環境變量中,而CGI程序則從環境變量中獲取這些必要信息,所以能夠實現兩者之間的信息交換。CGI程序處理完後,本來發送到「標準輸出」的信息會被轉到web服務器,服務器再將結果返回給客戶端。apache

如下這些參數大可能是CGI標準規定,須要由web服務器傳遞給CGI程序的(經過前面所說的「環境變量」的方式):segmentfault

Server specific variables:
    SERVER_SOFTWARE: HTTP服務器的 name/version
    SERVER_NAME: 服務器的主機名(也能夠是IP地址)
    GATEWAY_INTERFACE: CGI/version.
Request specific variables:
    SERVER_PROTOCOL: HTTP/version.
    SERVER_PORT: TCP 端口.
    REQUEST_METHOD: HTTP請求方式(GET,POST等).
    PATH_INFO: 路徑後綴
    PATH_TRANSLATED: 若是PATH_INFO存在的話,該參數表明相應的在服務器上的絕對路徑。
    SCRIPT_NAME: 相應的到程序的路徑(例如/cgi-bin/script.cgi)
    QUERY_STRING: URL中「?」後後面接着的那部分。這些請求字符串(query string)一般以「name=value」的形式出現(例如var1=val1&var2=val2...)
    REMOTE_HOST: 客戶端的主機名
    REMOTE_ADDR: 客戶端的ip地址。
    AUTH_TYPE: 認證類型(若是可用的話)
    REMOTE_USER :與AUTH_TYPE相關
    REMOTE_IDENT: see ident, only if server performed such lookup.
    CONTENT_TYPE: Internet media type of input data if PUT or POST method are used, as provided via HTTP header.
    CONTENT_LENGTH: similarly, size of input data (decimal, in octets) if provided via HTTP header.
    其餘與user agent相關的參數(一般就是瀏覽器) :HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_USER_AGENT, HTTP_COOKIE

CGI的缺點
每次請求都要啓動一個CGI程序,相對於一次請求處理,啓動過程的性能消耗佔整個過程的消耗比例不小,所以若是每次請求都須要啓動一個新的CGI程序來處理,明顯在性能上是低效的。瀏覽器

CGI的替代方案
因爲上面提到的CGI的缺點,出現瞭如下這些替代方案:服務器

  1. fastCGI(「prefork」預生成);
  2. 模塊化,直接在web服務器中運行相應的程序來實現動態生成html(例如apache的mod_php);
  3. 使用預編譯的CGI程序(即編譯型語言);
  4. Java的servlet

FastCGI & php-fpm

什麼是FastCGI
FastCGI是在CGI標準協議上發展出來的一個變種協議,它的主要目標是減輕web服務器與CGI程序之間交互時的負載,這樣一臺服務器就能夠在同一時間處理更多的web請求。dom

FastCGI的實現細節
與CGI每次處理一個請求時都啓動一個新的CGI程序不一樣,FastCGI使用一些常駐內存的CGI進程來處理源源不斷的請求。這些CGI進程是由FastCGI管理進程(FastCGI server)來管理,而非web服務器。當接收到一個web請求時,web服務器把一些必要的信息和頁面請求自己經過Unix域套接字( Unix domain socket),或命名管道(named pipe ),或TCP鏈接( TCP connection)發送給FastCGI進程(至於發給哪一個CGI進程則是由FastCGI管理進程來分配)。經過相同的鏈接方式,web響應返回給web服務器。響應返回後,本次鏈接可能會被關閉掉,可是web服務器和這些處理請求的CGI進程會繼續駐留在內存中,等待處理下一個請求。所以,每個CGI進程在它的生命週期內能夠處理不少個web請求,而不是像CGI那樣只能處理一個web請求。socket

什麼是php-fpm
PHP-FPM (FastCGI Process Manager)是FastCGI在PHP上的具體實現,從PHP5.3.3開始,已經被集成到PHP的安裝包中。

Apache與php的鏈接

  1. CGI(基本已經不用)
  2. 模塊化(mod_php)
  3. FastCGI

具體配置能夠參考:
https://segmentfault.com/q/10...
http://php.net/manual/en/inst...

nginx與php的鏈接方式

一般使用FastCGI方式

具體配置參考
https://segmentfault.com/a/11...
http://php.net/manual/en/inst...

參考文獻

https://en.wikipedia.org/wiki...
https://en.wikipedia.org/wiki...
https://en.wikipedia.org/wiki...
http://php.net/manual/en/inst...

相關文章
相關標籤/搜索