一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

我所了解的cgi

 herowuking 2015-07-24

  當我們在談到cgi的時候,我們在討論什么

  最早的Web服務器簡單地響應瀏覽器發(fā)來的HTTP請求,并將存儲在服務器上的HTML文件返回給瀏覽器,也就是靜態(tài)html。事物總是不斷發(fā)展,網(wǎng)站也越來越復雜,所以出現(xiàn)動態(tài)技術(shù)。但是服務器并不能直接運行 php,asp這樣的文件,自己不能做,外包給別人吧,但是要與第三做個約定,我給你什么,然后你給我什么,就是握把請求參數(shù)發(fā)送給你,然后我接收你的處理結(jié)果給客戶端。那這個約定就是 common gateway interface,簡稱cgi。這個協(xié)議可以用vb,c,php,python 來實現(xiàn)。cgi只是接口協(xié)議,根本不是什么語言。下面圖可以看到流程                        

 

  WEB服務器與cgi程序交互

   WEB服務器將根據(jù)CGI程序的類型決定數(shù)據(jù)向CGI程序的傳送方式,一般來講是通過標準輸入/輸出流和環(huán)境變量來與CGI程序間傳遞數(shù)據(jù)。 如下圖所示:

  CGI程序通過標準輸入(STDIN)和標準輸出(STDOUT)來進行輸入輸出。此外CGI程序還通過環(huán)境變量來得到輸入,操作系統(tǒng)提供了許多環(huán)境變量,它們定義了程序的執(zhí)行環(huán)境,應用程序可以存取它們。Web服務器和CGI接口又另外設(shè)置了一些環(huán)境變量,用來向CGI程序傳遞一些重要的參數(shù)。CGI的GET方法還通過環(huán)境變量QUERY-STRING向CGI程序傳遞Form中的數(shù)據(jù)。 下面是一些常用的CGI環(huán)境變量:

變量名描述
CONTENT_TYPE 這個環(huán)境變量的值指示所傳遞來的信息的MIME類型。目前,環(huán)境變量CONTENT_TYPE一般都是:application/x-www-form-urlencoded,他表示數(shù)據(jù)來自于HTML表單。
CONTENT_LENGTH 如果服務器與CGI程序信息的傳遞方式是POST,這個環(huán)境變量即使從標準輸入STDIN中可以讀到的有效數(shù)據(jù)的字節(jié)數(shù)。這個環(huán)境變量在讀取所輸入的數(shù)據(jù)時必須使用。
HTTP_COOKIE 客戶機內(nèi)的 COOKIE 內(nèi)容。
HTTP_USER_AGENT 提供包含了版本數(shù)或其他專有數(shù)據(jù)的客戶瀏覽器信息。
PATH_INFO 這個環(huán)境變量的值表示緊接在CGI程序名之后的其他路徑信息。它常常作為CGI程序的參數(shù)出現(xiàn)。
QUERY_STRING 如果服務器與CGI程序信息的傳遞方式是GET,這個環(huán)境變量的值即使所傳遞的信息。這個信息經(jīng)跟在CGI程序名的后面,兩者中間用一個問號'?'分隔。
REMOTE_ADDR 這個環(huán)境變量的值是發(fā)送請求的客戶機的IP地址,例如上面的192.168.1.67。這個值總是存在的。而且它是Web客戶機需要提供給Web服務器的唯一標識,可以在CGI程序中用它來區(qū)分不同的Web客戶機。
REMOTE_HOST 這個環(huán)境變量的值包含發(fā)送CGI請求的客戶機的主機名。如果不支持你想查詢,則無需定義此環(huán)境變量。
REQUEST_METHOD 提供腳本被調(diào)用的方法。對于使用 HTTP/1.0 協(xié)議的腳本,僅 GET 和 POST 有意義。
SCRIPT_FILENAME CGI腳本的完整路徑
SCRIPT_NAME CGI腳本的的名稱
SERVER_NAME 這是你的 WEB 服務器的主機名、別名或IP地址。
SERVER_SOFTWARE 這個環(huán)境變量的值包含了調(diào)用CGI程序的HTTP服務器的名稱和版本號。例如,上面的值為Apache/2.2.14(Unix)

 

  一個例子

  說了這么多,你也許感覺煩了,寫個小程序可能會更好的理解。 lighttpd + CGI,用c語言寫cgi程序 。

      lighttpd 配置 cgi, 打開cgi.conf, cgi.assign = (".cgi" => "") 設(shè)置 cgi 模塊的擴展名和解釋器。就本語句而言,表示cgi模塊的擴展名是“.cgi”且該 cgi 模塊不需要特別的解釋器來執(zhí)行。因為用c來寫的是可執(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í)行文件放到你的服務器配置程序的目錄下

gcc test.c -o test.cgi

 訪問:http://localhost/test.cgi?a=b&c=d 結(jié)果為: 

a=b&c=d
Hello cgi!

  通過環(huán)境變量"QUERY_STRING" 獲取get 方式提交的內(nèi)容,如果想獲取post 提交的內(nèi)容可以通過getenv("CONTENT-LENGTH"),Web服務器在調(diào)用使用POST方法的CGI程序時設(shè)置此環(huán)境變量,它的文本值表示W(wǎng)eb服務器傳送給CGI程序的輸入中的字符數(shù)目。上面例子展示了cgi 程序與web服務器的交互。

  cgi 與 fastcgi

  CGI工作原理:每當客戶請求CGI的時候,WEB服務器就請求操作系統(tǒng)生成一個新的CGI解釋器進程(如php-cgi.exe),CGI 的一個進程則處理完一個請求后退出,下一個請求來時再創(chuàng)建新進程。當然,這樣在訪問量很少沒有并發(fā)的情況也行??墒钱斣L問量增大,并發(fā)存在,這種方式就不適合了。于是就有了fastcgi。

  FastCGI像是一個常駐(long-live)型的CGI,它可以一直執(zhí)行著,只要激活后,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。

  一般情況下,F(xiàn)astCGI的整個工作流程是這樣的:

  1.Web Server啟動時載入FastCGI進程管理器(IIS ISAPI或Apache Module)

        2.FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)并等待來自Web Server的連接。

        3.當客戶端請求到達Web Server時,F(xiàn)astCGI進程管理器選擇并連接到一個CGI解釋器。 Web server將CGI環(huán)境變量和標準輸入發(fā)送到FastCGI子進程php-cgi。

        4.FastCGI子進程完成處理后將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關(guān)閉連接時, 請求便告處理完成。FastCGI子進程接著等待并處理來自FastCGI進程管理器(運行在Web Server中)的下一個連接。 在CGI模式中,php-cgi在此便退出了。

        PHP-FPM與Spawn-FCGI

  Spawn-FCGI是一個通用的FastCGI管理服務器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI進行FastCGI模式下的管理工作。 但是有缺點,于是PHP-fpm就是針對于PHP的,F(xiàn)astcgi的一種實現(xiàn),他負責管理一個進程池,來處理來自Web服務器的請求。目前,PHP-fpm是內(nèi)置于PHP的。

  apache 模塊方式

  記得曾在xp 配置 apache + php ,會在apache 配置下面一段:

LoadModule php5_module C:/php/php5apache2_2.dll

  當PHP需要在Apache服務器下運行時,一般來說,它可以模塊的形式集成, 此時模塊的作用是接收Apache傳遞過來的PHP文件請求,并處理這些請求, 然后將處理后的結(jié)果返回給Apache。如果我們在Apache啟動前在其配置文件中配置好了PHP模塊, PHP模塊通過注冊apache2的ap_hook_post_config掛鉤,在Apache啟動的時候啟動此模塊以接受PHP文件的請求。

     Apache 的Hook機制是指:Apache 允許模塊(包括內(nèi)部模塊和外部模塊,例如mod_php5.so,mod_perl.so等)將自定義的函數(shù)注入到請求處理循環(huán)中。 換句話說,模塊可以在Apache的任何一個處理階段中掛接(Hook)上自己的處理函數(shù),從而參與Apache的請求處理過程。 mod_php5.so/ php5apache2.dll就是將所包含的自定義函數(shù),通過Hook機制注入到Apache中,在Apache處理流程的各個階段負責處理php請求。

有人測試nginx+PHP-FPM在高并發(fā)情況下可能會達到Apache+mod_php5的5~10倍,現(xiàn)在nginx+PHP-FPM使用的人越來越多。

--EOF

 我不是碼農(nóng),我只是互聯(lián)網(wǎng)的搬運工。如果對你有幫助,麻煩點贊啊:-D

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日本一二三区不卡免费| 国产在线小视频你懂的| 中文字幕91在线观看| 欧美区一区二在线播放| 一个人的久久精彩视频| 国产一区一一一区麻豆| 成人免费观看视频免费| 欧美成人久久久免费播放| 好吊日视频这里都是精品| 国产女高清在线看免费观看| 日韩国产中文在线视频| 久久re6热在线视频| 丝袜人妻夜夜爽一区二区三区| 亚洲欧洲日韩综合二区| 欧美日韩一区二区午夜| 伊人国产精选免费观看在线视频| 视频一区日韩经典中文字幕| 久久99夜色精品噜噜亚洲av| 国产av精品一区二区| 国产一区二区三区口爆在线| 中文字幕人妻综合一区二区 | 又大又长又粗又猛国产精品| 五月激情婷婷丁香六月网| 亚洲成人黄色一级大片| 国产精品香蕉在线的人| 丰满少妇被猛烈撞击在线视频| 亚洲乱妇熟女爽的高潮片| 亚洲精品小视频在线观看| 免费观看在线午夜视频| 小草少妇视频免费看视频| 人妻乱近亲奸中文字幕| 午夜久久久精品国产精品| 99热九九热这里只有精品| 日韩精品一级片免费看| 国产精品一区二区视频| 夫妻性生活动态图视频| 在线观看免费无遮挡大尺度视频| 国产又粗又猛又爽又黄的文字| 中文字幕五月婷婷免费| 欧美日韩国产另类一区二区| 美女被后入视频在线观看|