摘要:程序處理完后,原本發送到標準輸出的信息會被轉到服務器,服務器再將結果返回給客戶端。通過相同的連接方式,響應返回給服務器。
CGI
什么是CGI
CGI(Common Gateway Interface)是一個標準協議,它為web服務器提供了一個標準的協議,以便于服務器可以像運行命令行接口程序那樣來運行第三方程序,這些第三方程序可以動態地生成web頁面。這些第三方程序被稱為CGI腳本(滿足CGI定義的程序),或者簡稱CGIs。至于這些CGI程序是如何被執行的則是由服務器決定的。在一般情況下,CGI腳本在接收到web請求能動態地生成HTML。
為什么會有CGI
正如瀏覽器會將請求信息發送給web服務器,web服務器在需要CGI程序時也會將一些必要的信息傳遞給CGI程序。相應的,當CGI程序運行完后也需要將一些信息返回給web服務器,這些信息包括了http相應中的一些內容,例如:當前請求的響應狀態,返回的內容類型(e.g. HTML, PDF, or plain text)等等。
在很早之前,不同的web服務器會使用不同的方法去跟CGI程序交換信息,這使得CGI程序的通用性不強(根據不同的web服務器需要相應的修改CGI程序)。因此CGI誕生了,它定義了一些通用的方法的來規范web服務器和CGI程序之間的信息交流。早期CGI程序主要被用來處理HTML表單。
webserver與CGI程序的連接
在web服務器中往往可以配置哪些url需要被CGI程序來處理。這通常是通過規定服務器某些目錄是屬于CGI程序的(這個目錄對應著某種形式的url,例如“http://example.com/cgi-bin/pr...”這個url對應著cgi-bin這個目錄,因此服務器知道這個請求需要被CGI程序來處理)
web服務器通過將必要的信息存儲在環境變量中,而CGI程序則從環境變量中獲取這些必要信息,因此可以實現二者之間的信息交換。CGI程序處理完后,原本發送到“標準輸出”的信息會被轉到web服務器,服務器再將結果返回給客戶端。
以下這些參數大多是CGI標準規定,需要由web服務器傳遞給CGI程序的(通過前面所說的“環境變量”的方式):
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的缺點,出現了以下這些替代方案:
fastCGI(“prefork”預生成);
模塊化,直接在web服務器中運行相應的程序來實現動態生成html(例如apache的mod_php);
使用預編譯的CGI程序(即編譯型語言);
Java的servlet
FastCGI & php-fpm什么是FastCGI
FastCGI是在CGI標準協議上發展出來的一個變種協議,它的主要目標是減輕web服務器與CGI程序之間交互時的負載,這樣一臺服務器就可以在同一時間處理更多的web請求。
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請求。
什么是php-fpm
PHP-FPM (FastCGI Process Manager)是FastCGI在PHP上的具體實現,從PHP5.3.3開始,已經被集成到PHP的安裝包中。
CGI(基本已經不用)
模塊化(mod_php)
FastCGI
具體配置可以參考:
https://segmentfault.com/q/10...
http://php.net/manual/en/inst...
通常使用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...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/35843.html
摘要:當客戶端請求到達時,進程管理器選擇并連接到一個解釋器。什么是是一個管理器,是只用于的可以在下載得到其實是源代碼的一個補丁,旨在將進程管理整合進包中。與功能比較都是守護的進程管理器。 什么是CGI CGI全稱是公共網關接口(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行交談的一種工具,其程序須運行在網絡服務器上。 CGI可以用任何一種語言編...
摘要:的工作原理啟動時載入進程管理器或進程管理器自身初始化,啟動多個解釋器進程可見多個并等待來自的連接。當客戶端請求到達時,進程管理器選擇并連接到一個解釋器。什么是是一個管理器,是只用于的其實是源代碼的一個補丁,旨在將進程管理整合進包中。 什么是CGI CGI全稱是公共網關接口(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行交談的一種工具,其程...
摘要:深入協議從功能上來講,協議已經完全能夠解決服務器與應用之間的數據通信問題。消息頭信息主要的消息頭信息如下用于表示協議版本號。從服務器發送到應用,表示中止一個處理中的請求。另外我們還需要明確一點就是服務器與進程間通信是無序的。 本文首發于 深入剖析 Web 服務器與 PHP 應用之間的通信機制 - 掌握 CGI 和 FastCGI 協議的運行原理,轉載請注明出處! 身為一名使用 PHP ...
摘要:通過或在服務器上運行時可以使用的可執行文件,可以理解為解釋器也有說是官方的進程管理器,至于是什么文章后面再分析,這里就當作解釋器。就是為了解決的問題,制定的協議。 一個模糊的概念 無論是php,python編程語言,還是apache,nginx服務器對于cgi協議是個繞不開的話題。安裝,部署都會經常的看到,那么它們到底是干什么的,網上的答案非常的多!今天通過它們進行一波匯總,徹底告別這...
摘要:通過或在服務器上運行時可以使用的可執行文件,可以理解為解釋器也有說是官方的進程管理器,至于是什么文章后面再分析,這里就當作解釋器。就是為了解決的問題,制定的協議。 一個模糊的概念 無論是php,python編程語言,還是apache,nginx服務器對于cgi協議是個繞不開的話題。安裝,部署都會經常的看到,那么它們到底是干什么的,網上的答案非常的多!今天通過它們進行一波匯總,徹底告別這...
摘要:通過或在服務器上運行時可以使用的可執行文件,可以理解為解釋器也有說是官方的進程管理器,至于是什么文章后面再分析,這里就當作解釋器。就是為了解決的問題,制定的協議。 一個模糊的概念 無論是php,python編程語言,還是apache,nginx服務器對于cgi協議是個繞不開的話題。安裝,部署都會經常的看到,那么它們到底是干什么的,網上的答案非常的多!今天通過它們進行一波匯總,徹底告別這...
閱讀 629·2023-04-26 01:53
閱讀 2753·2021-11-17 17:00
閱讀 2888·2021-09-04 16:40
閱讀 1988·2021-09-02 15:41
閱讀 838·2019-08-26 11:34
閱讀 1227·2019-08-26 10:16
閱讀 1338·2019-08-23 17:51
閱讀 820·2019-08-23 16:50