CGI原理

一、CGI技術

1.1 CGI的提出

  CGI是外部擴展應用程序與WWW服務器交互的一個標準接口。按照CGI標準編寫的外部擴展應用程序可以處理客戶端(一般是WWW瀏覽器)輸入的協同工作數據,完成客戶端與服務器的交互操作。這在實際應用中非常有用,如可以編寫CGI外部擴展程序來訪問外部數據庫,客戶端用戶可以通過它和WWW服務器來進行數據查詢。CGI一般分兩種:標準CGI和緩衝CGI。所有的WWW服務器均應支持標準CGI,按標準CGI編寫的程序與具體的WWW服務器無關。而按緩衝CGI編寫的程序與WWW服務器有關。

1.2 CGI的工作原理

  1.標準CGI

  客戶端、服務器、CGI接口與外部程序間的關係可用圖1-1表示(編排者:圖略):如上圖所示,服務器是客戶端(如瀏覽器)與擴展程序之間的通道。當客戶端的用戶完成了一定輸入工作(比如填充完HTML文檔中的FORM表)之後向服務器發出HTTP請求(稱爲CGI請求),服務器守護進程接收到該請求後,就創建一個子進程(稱爲CGI進程)。該CGI子進程將CGI請求的有關數據設置成環境變量,在外部CGI程序與服務器間建立兩條數據通道(標準I/O),然後啓動URL指定的CGI程序,並與該子進程保持同步,以監測CGI程序的執行狀態。子進程通過標準輸出流將處理結果傳遞給服務器守護進程,守護進程再將處理結果作爲應答消息回送到客戶端。外部CGI程序通過環境變量、命令行參數、標準輸入輸出與WWW服務器進行通訊,傳遞有關參數和處理結果。
*環境變量:當服務器守護進程創建子進程運行CGI程序時,設置相應的環境變量和命令行參數,以傳遞客戶端和服務器的有關信息給該子進程。
*命令行參數:命令行參數僅在有HTML文檔中有SINDEX查詢的情況下使用。
*標準輸入輸出:當HTTP請求模式採用POST方式時,CGI程序通過標準輸入流和有關環境變量來獲取客戶端傳輸數據;如採用GET方式時,CGI程序直接通過環境變量獲取客戶端傳輸數據。當CGI程序要返回處理結果(一般爲HTML文檔)給客戶端時,它通過標準輸出流將該結果數據傳遞給服務器守護進程。

  2.緩衝CGI

  標準CGI使用Stdin/Stdout來進行數據通訊,這是由其最初開發環境(Unix操作系統)所決定的。但是許多Windows環境下的編程工具(如VB和Delphi等)是不支持這種I/O方式的,這時就不能用它們來開發基於標準CGI的應用程序。於是有些服務器提出了緩衝CGI的概念。緩衝CGI亦稱爲WinCGI。此時CGI擴展程序與服務器間通過緩衝CGI而不是標準CGI進行通訊,而緩衝CGI與服務器間的通訊還是通過標準CGI接口。後者由WWW服務器的內置緩衝處理程序實現。這幾部分的關係可用圖1-2表示(編排者:圖略):緩衝CGI的工作原理與標準CGI相似,不同的是當服務器守護進程接收到客戶端的CGI請求時,所建立的CGI子進程將CGI請求的有關數據設置成環境變量外,還將它們保存在輸入緩衝區中;通過緩衝處理程序在外部CGI程序與服務器間建立兩條數據通道(輸入/輸出緩衝區)。CGI子進程通過輸出緩衝區將處理結果傳遞給服務器守護進程。此處外部CGI程序通過環境變量和輸入/輸出緩衝區與WWW服務器進行通訊,傳遞有關參數和處理結果。此處環境變量的意義同上,不過這些環境變量及其相應值保存在輸入緩衝區中。此外,輸入緩衝區中還存放客戶端的傳輸數據(如採用POST模式的話)。輸出緩衝區用來存放擴展程序的處理結果。

  3.標準CGI與緩衝CGI的區別

  對CGI擴展程序而言,最主要差別在於數據的I/O不同:對緩衝CGI,服務器與CGI擴展程序間的數據交換是通過緩衝區;而標準CGI是通過標準I/O。使用緩衝CGI可選擇更多的開發工具,可以開發Windows95和WindowsNT下的GUI擴展程序;而使用標準CGI所選用的開發工具必須支持標準I/O。只有少數幾種WWW服務器支持緩衝CGI,因此基於它的擴展程序兼容性不如標準CGI好。

1.3 CGI與其他WWW技術的關係

  CGI作爲WWW服務器的標準擴展技術,由上面CGI的基本原理可知,它和許多其它的WWW技術密切相關,如HTTP、HTML、MIME和URL等,下面主要就它與前兩種技術的關係進行研究。

  1.CGI與HTTP協議

  CGI通過HTTP協議在客戶端和服務端進行通訊:*客戶端用戶代理向服務器發送的請求是HTTP請求消息。該消息中含有處理用戶輸入的CGI擴展程序的URL值。*CGI擴展程序在處理結束後,返回給客戶端的應答是HTTP應答消息。因此CGI程序的輸出數據必須符合HTTP應答消息的語法格式,這在基於CGI標準的開發中非常重要。

  2.CGI與HTML語言

  CGI擴展程序的輸出數據(HTTP應答消息)一般有兩種:符合MIME類型的文檔(最普遍的是HTML文檔,表示爲text/html);指向其它文檔的URL鏈接。這兩種方式都與HTML語言有關,數據的組織須符合HTML語法格式。

1.4 CGI開發的幾個問題

  基於WWW的人機交互一般有兩種情況:本地交互和通過網絡傳輸的交互。前者是指客戶端用戶的輸入數據在客戶端本地進行處理,然後將處理結果返回給用戶,常見的開發工具有JavaScript(Netscape開發)和VBScript(Microsoft開發);後者是指客戶端用戶輸入的數據通過網絡傳輸到WWW服務器,服務器處理結束後將處理結果返回給客戶端用戶,常見的開發技術是WWW服務器擴展技術(如CGI,API等)。此處主要討論基於標準CGI技術的通過網絡進行數據傳輸的交互實現。對這種人機交互的實現,主要有三個環節需要解決:如何獲取客戶端傳輸的數據,如何提取有效數據並處理這些數據,如何向客戶端返回應答。下面分別結合有關技術,談談這三方面問題的解決。

  1.客戶端傳輸數據的獲取

  由第三章CGI的原理可知,當服務端守護進程接收到客戶端用戶代理(如瀏覽器)提交的CGI請求時,所創建的CGI子進程會設置與CGI請求內容有關的環境變量,並建立服務器與外部CGI程序之間通訊的通道(即標準I/O)。CGI程序可以通過環境變量,標準I/O或命令行參數獲取客戶端用戶輸入的數據。數據的獲取與請求所採用的HTTP方法(Method)和用戶所使用的請求方式有關。用戶通過CGI請求數據一般有三種方式:HTMLFORM表,ISINDEX,可點擊圖片(ISMAP或Imagemaps)。後兩種方式是通過命令行參數傳遞用戶的輸入數據;在C語言中(下面的舉例亦然),CGI程序可以用argc和argv[int]獲得這些參數值。而前一種方式則取決於HTTP請求方法;但不管採用何種方法,都將用到環境變量來傳遞有關請求內容。

  ●獲取環境變量環境變量的類別很多,包含客戶端和服務端的詳細信息。在一般CGI程序開發中,下述幾個環境變量在數據傳遞中起着重要作用。

   *GATEWAY—INTERFACE

  CGI程序所使用的CGI標準接口的版本號。如使用的CGI1.1版,該變量表示爲“CGI/1.1”

   *REQUEST—METHOD   HTTP請求方法。根據該變量值可判斷CGI請求所採用的請求方法,以決定是通過Stdin還是通過環境變量QUERY—STRING獲取客戶端傳輸數據。

   *QUERY—STRING

  QUERY—STRING是CGI程序URL中“?”之後的數據。當使用ISINDEX查詢或FORM表使用GET方法時,客戶端傳輸數據可以通過讀取該變量而獲得。

   *CONTENT—LENGTH

  CONTENT—LENGTH表示客戶端傳輸數據的字節數。

   *CONTENT—TYPE

  CONTENT—TYPE表示客戶端傳輸數據的數據編碼類型。利用— environ(int)函數可以獲得所有的環境變量及其值;利用getenv(constchar*)函數可以獲得指定環境變量的相應值。

  ●HTTP請求方法

  客戶端用戶代理提交的CGI請求是HTTP請求,其中包括HTTP請求方法。HTTP協議定義的請求方法中常用的主要有GET和POST。客戶端FORM表的METHOD屬性用來設置請求方法,其缺省值爲GET。如果在FORM中使用GET方法,CGI程序通過環境變量QUERY—STRING獲取客戶端傳輸數據。如果在FORM中使用POST方法,CGI程序通過通過CONTENT—LENGTH獲取客戶端傳輸數據的字節數,通過Stdin讀取客戶端傳輸數據。

  2.有效數據的提取和處理

  通過上述方式獲取的客戶端傳輸數據的一般格式爲:

  name[1]=value[1]&name[2]=value[2]&...name=value...name[n]=value[n]

  
其中name[i]表示變量名,它是在FORM表中某輸入域的名字;value[i]表示變量值,它是用戶在FORM表中某輸入域中輸入的值。客戶端傳輸數據的每對″name=value″串由′&′字符分隔,其數據編碼類型可以從環境變量CONTENT—TYPE獲取。CGI/1.1版僅支持“application/x-www-form-urlencoded”編碼方式。這種編碼方式和URL的編碼方式一樣,遵循兩個規則:數據中的空格(ASCII碼值32)編碼成′+′號;保留字符編碼成″%xx″形式,″XX″是該字符ASCII值的十六進制表示,比如″$″的編碼爲″%24″,″?″的編碼爲″%3F″。因此,要獲取客戶端用戶的輸入數據,必須對上述獲取的數據進行分離和解碼等處理。利用函數strtok()、strchr()等可以實現數據分離處理,而數據的解碼則需要對整個數據串進行掃描,將數據串中的″%xx″復原爲對應的ASCII碼。在提取到有效數據後,還可能進行許多其他的處理,如數據庫查詢等。這種處理與普通編程相同。

  3.向客戶端返回應答

  CGI程序處理結束後,通過標準輸出流將應答信息傳遞給服務器,再由服務器返回給發出請求的客戶端。其輸出的應答信息是HTTP應答消息,它一般由兩部分組成:應答頭和應答數據。常見的應答頭包括三種頭域:Content—Type(數據編碼類型,用MIME類型表示),Location(特定文檔的URL,這種情況不直接向客戶端輸出內容而輸出該URL)和Status(處理結果的狀態碼和狀態描述)。HTTP應答頭由幾行格式相同的文本構成,每行的基本格式爲:″頭域名:該域內容″。應答頭和應答體之間用一空行加LF(或CR/LF)分隔。應答體爲CGI擴展程序的輸出數據,其數據類型應該與Content—Type值相一致。CGI程序的輸出可以用printf()、puts()等標準I/O函數來實現。

  4.CGI程序的開發及其一般流程

  在開發CGI程序過程中,可根據實際情況(服務器提供的接口、實際需求和程序員經驗等)選擇編程語言,如C/C++,Perl,TCL,AnyUnixshell,VB,AppleScript。如果選用C/C++等語言,必須編譯成可執行文件;如果選用Perl等解釋語言,服務器必須安裝相應的解釋器。

一、FastCGI是什麼:是一個可伸縮、高速的在web server和腳本語言間通迅的接口

  CGI工作原理:每當客戶請求CGI的時候,WEB服務器就請求操作系統生成一個新的CGI解釋器進程(如php-cgi.exe),當CGI滿足要求後,WEB服務器就殺死這個進程。
    所以,CGI解釋器的反覆加載是CGI性能低下的主要原因如果CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則可以 提供良好的性能、伸縮性、Fail- Over特性等等。

    FastCGI的官方站點在http://www.fastcgi.com

  FastCGI的工作原理是:
  1、Web Server 啓動時載入FastCGI進程管理器【PHP的FastCGI進程管理器是PHP-FPM(php-FastCGI Process Manager)】
  2、FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)並等待來自Web Server的連接。啓動php-cgi FastCGI進程時,可以配置以TCP和UNIX套接字(socket)兩種方式啓動。
  3、當客戶端請求到達Web Server時,Web Server將請求採用TCP協議或socket方式轉發到FastCGI主進程,FastCGI主進程選擇並連接到一個CGI解釋器(子進程php-cgi.exe)。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi.exe。
   4、FastCGI子進程php-cgi.ex完成處理後將標準輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連接。 而在CGI中,php-cgi子進程在此便被退出了。

  在上述情況中,你可以想象 CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部dll擴展並重初始化全部數據結構。使用FastCGI,所有這些 都只在進程啓動時發生一次。一個額外的好處是,持續數據庫連接可以工作。
可以令PHP程序從原來的請求-啓動-運行到請求-運行模式,大大提高了腳本的執行效率,減輕服務器的負荷。

二:PHP的FastCGI的優點:
1.php腳本運行速度更快,php解釋程序被載入內存而不是每次需要時從存儲器讀取,極大提升了依靠腳本運行站點的性能。
2.需要使用的系統資源更少,由於服務器不用在每次需要時都載入php解釋程序,你可以將站點的傳輸速度提升很多而不必增加cpu負擔。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章