當(dāng)我們?cè)谡劦絚gi的時(shí)候,我們?cè)谟懻撌裁?/h2>
|
| 變量名 | 描述 |
|---|---|
| CONTENT_TYPE | 這個(gè)環(huán)境變量的值指示所傳遞來(lái)的信息的MIME類型。目前,環(huán)境變量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示數(shù)據(jù)來(lái)自于HTML表單。 |
| CONTENT_LENGTH | 如果服務(wù)器與CGI程序信息的傳遞方式是POST,這個(gè)環(huán)境變量即使從標(biāo)準(zhǔn)輸入STDIN中可以讀到的有效數(shù)據(jù)的字節(jié)數(shù)。這個(gè)環(huán)境變量在讀取所輸入的數(shù)據(jù)時(shí)必須使用。 |
| HTTP_COOKIE | 客戶機(jī)內(nèi)的 COOKIE 內(nèi)容。 |
| HTTP_USER_AGENT | 提供包含了版本數(shù)或其他專有數(shù)據(jù)的客戶瀏覽器信息。 |
| PATH_INFO | 這個(gè)環(huán)境變量的值表示緊接在CGI程序名之后的其他路徑信息。它常常作為CGI程序的參數(shù)出現(xiàn)。 |
| QUERY_STRING | 如果服務(wù)器與CGI程序信息的傳遞方式是GET,這個(gè)環(huán)境變量的值即使所傳遞的信息。這個(gè)信息經(jīng)跟在CGI程序名的后面,兩者中間用一個(gè)問(wèn)號(hào)'?'分隔。 |
| REMOTE_ADDR | 這個(gè)環(huán)境變量的值是發(fā)送請(qǐng)求的客戶機(jī)的IP地址,例如上面的192.168.1.67。這個(gè)值總是存在的。而且它是Web客戶機(jī)需要提供給Web服務(wù)器的唯一標(biāo)識(shí),可以在CGI程序中用它來(lái)區(qū)分不同的Web客戶機(jī)。 |
| REMOTE_HOST | 這個(gè)環(huán)境變量的值包含發(fā)送CGI請(qǐng)求的客戶機(jī)的主機(jī)名。如果不支持你想查詢,則無(wú)需定義此環(huán)境變量。 |
| REQUEST_METHOD | 提供腳本被調(diào)用的方法。對(duì)于使用 HTTP/1.0 協(xié)議的腳本,僅 GET 和 POST 有意義。 |
| SCRIPT_FILENAME | CGI腳本的完整路徑 |
| SCRIPT_NAME | CGI腳本的的名稱 |
| SERVER_NAME | 這是你的 WEB 服務(wù)器的主機(jī)名、別名或IP地址。 |
| SERVER_SOFTWARE | 這個(gè)環(huán)境變量的值包含了調(diào)用CGI程序的HTTP服務(wù)器的名稱和版本號(hào)。例如,上面的值為Apache/2.2.14(Unix) |
說(shuō)了這么多,你也許感覺(jué)煩了,寫(xiě)個(gè)小程序可能會(huì)更好的理解。 lighttpd + CGI,用c語(yǔ)言寫(xiě)cgi程序 。
lighttpd 配置 cgi, 打開(kāi)cgi.conf, cgi.assign = (".cgi" => "") 設(shè)置 cgi 模塊的擴(kuò)展名和解釋器。就本語(yǔ)句而言,表示cgi模塊的擴(kuò)展名是“.cgi”且該 cgi 模塊不需要特別的解釋器來(lái)執(zhí)行。因?yàn)橛胏來(lái)寫(xiě)的是可執(zhí)行文件。
下面是 test.c 代碼:
#include "stdio.h" #include "stdlib.h" #include <string.h> int main() { char *data; data = getenv("QUERY_STRING"); puts(data); printf("Hello cgi!"); return 0; }
生成可執(zhí)行文件放到你的服務(wù)器配置程序的目錄下
gcc test.c -o test.cgi
訪問(wèn):http://localhost/test.cgi?a=b&c=d 結(jié)果為:
a=b&c=d Hello cgi!
通過(guò)環(huán)境變量"QUERY_STRING" 獲取get 方式提交的內(nèi)容,如果想獲取post 提交的內(nèi)容可以通過(guò)getenv("CONTENT-LENGTH"),Web服務(wù)器在調(diào)用使用POST方法的CGI程序時(shí)設(shè)置此環(huán)境變量,它的文本值表示W(wǎng)eb服務(wù)器傳送給CGI程序的輸入中的字符數(shù)目。上面例子展示了cgi 程序與web服務(wù)器的交互。
CGI工作原理:每當(dāng)客戶請(qǐng)求CGI的時(shí)候,WEB服務(wù)器就請(qǐng)求操作系統(tǒng)生成一個(gè)新的CGI解釋器進(jìn)程(如php-cgi.exe),CGI 的一個(gè)進(jìn)程則處理完一個(gè)請(qǐng)求后退出,下一個(gè)請(qǐng)求來(lái)時(shí)再創(chuàng)建新進(jìn)程。當(dāng)然,這樣在訪問(wèn)量很少?zèng)]有并發(fā)的情況也行??墒钱?dāng)訪問(wèn)量增大,并發(fā)存在,這種方式就不適合了。于是就有了fastcgi。
FastCGI像是一個(gè)常駐(long-live)型的CGI,它可以一直執(zhí)行著,只要激活后,不會(huì)每次都要花費(fèi)時(shí)間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。
一般情況下,F(xiàn)astCGI的整個(gè)工作流程是這樣的:
1.Web Server啟動(dòng)時(shí)載入FastCGI進(jìn)程管理器(IIS ISAPI或Apache Module)
2.FastCGI進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)CGI解釋器進(jìn)程(可見(jiàn)多個(gè)php-cgi)并等待來(lái)自Web Server的連接。
3.當(dāng)客戶端請(qǐng)求到達(dá)Web Server時(shí),F(xiàn)astCGI進(jìn)程管理器選擇并連接到一個(gè)CGI解釋器。 Web server將CGI環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi。
4.FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回Web Server。當(dāng)FastCGI子進(jìn)程關(guān)閉連接時(shí), 請(qǐng)求便告處理完成。FastCGI子進(jìn)程接著等待并處理來(lái)自FastCGI進(jìn)程管理器(運(yùn)行在Web Server中)的下一個(gè)連接。 在CGI模式中,php-cgi在此便退出了。
PHP-FPM與Spawn-FCGI
Spawn-FCGI是一個(gè)通用的FastCGI管理服務(wù)器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI進(jìn)行FastCGI模式下的管理工作。 但是有缺點(diǎn),于是PHP-fpm就是針對(duì)于PHP的,F(xiàn)astcgi的一種實(shí)現(xiàn),他負(fù)責(zé)管理一個(gè)進(jìn)程池,來(lái)處理來(lái)自Web服務(wù)器的請(qǐng)求。目前,PHP-fpm是內(nèi)置于PHP的。
記得曾在xp 配置 apache + php ,會(huì)在apache 配置下面一段:
LoadModule php5_module C:/php/php5apache2_2.dll
當(dāng)PHP需要在Apache服務(wù)器下運(yùn)行時(shí),一般來(lái)說(shuō),它可以模塊的形式集成, 此時(shí)模塊的作用是接收Apache傳遞過(guò)來(lái)的PHP文件請(qǐng)求,并處理這些請(qǐng)求, 然后將處理后的結(jié)果返回給Apache。如果我們?cè)贏pache啟動(dòng)前在其配置文件中配置好了PHP模塊, PHP模塊通過(guò)注冊(cè)apache2的ap_hook_post_config掛鉤,在Apache啟動(dòng)的時(shí)候啟動(dòng)此模塊以接受PHP文件的請(qǐng)求。
Apache 的Hook機(jī)制是指:Apache 允許模塊(包括內(nèi)部模塊和外部模塊,例如mod_php5.so,mod_perl.so等)將自定義的函數(shù)注入到請(qǐng)求處理循環(huán)中。 換句話說(shuō),模塊可以在Apache的任何一個(gè)處理階段中掛接(Hook)上自己的處理函數(shù),從而參與Apache的請(qǐng)求處理過(guò)程。 mod_php5.so/ php5apache2.dll就是將所包含的自定義函數(shù),通過(guò)Hook機(jī)制注入到Apache中,在Apache處理流程的各個(gè)階段負(fù)責(zé)處理php請(qǐng)求。
有人測(cè)試nginx+PHP-FPM在高并發(fā)情況下可能會(huì)達(dá)到Apache+mod_php5的5~10倍,現(xiàn)在nginx+PHP-FPM使用的人越來(lái)越多。
--EOF
|
|
來(lái)自: herowuking > 《Perl》