论坛: 网站建设 标题: CGI技术及其开发 复制本贴地址    
作者: Aoming [aoming]    版主   登录
主题 CGI技术及其开发
出自 http://grace7450.xiloo.com
作者 匿名
日期 2002年09月13日 22:30


  作为Internet上最主要的信息管理和组织手段,WWW由一系列相应的技术及应用构成,其组成技术包括HTTP、HTML、URL以及CGI等。WWW服务器本身提供一些基本功能,以完成客户端的请求和自身的管理。但不同的用户有不同的功能要求,其中许多功能是WWW服务器本身 不能提供的(比如在线查询等),它必须提供一种扩展手段,以允许用户编写扩展应用程序来扩展服务器的功能。CGI(CommonGatewayInterface,即通用网关接口)就是这样的一种标准扩展技术。下面就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[i]=value[i]...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等解释语言,服务器必须安装相应的解释器。

二、CGI与其它扩展技术的比较

  除CGI标准扩展技术外,常见的扩展技术还有API(ApplicationProgrammingInterface)和SSI(ServerSideIncludes),这两种技术都与具体的WWW服务器有关。下面先对这两种技术简要说明,然后再对这三种技术作比较。SSI技术:当服务器守护进程接收到客户端请求时,其子进扫描客户端所请求的文档,以获取数据插入标志,再插入相关动态数据,然后返回给客户端。这种技术简单,但效率不高。API技术:不同的WWW服务器提供的API可能不同,比如O′ReillyWebsite提供的是WSAPI;PurveyorWebserver和MicrosoftIIS提供的是ISAPI。利用这些API编写程序的流程和最后生成的文件类型也不一样;比如用ISAPI,编写程序时必须依照它的特定框架,最后建立的文件可以是EXE文件和DLL文件。下表(表3-3)列出了CGI、SSI和API三种技术在主要性能方面的比较:

(表3-3)
--------------------------------------
常见扩展技术 SSI CGI API
实现的灵活性 差 好 好
可实现的功能 差 强大 强大
对程序员的要求 低 一般 较高
开发与测试时间 短 一般 较长
花费 低 一般 较高
操作的风险性 低 低 较大
移植性 较好 较好 差
CPU的负载 高 高 较低
--------------------------------------

CGI和API都需要编程实现,利用它们可访问更多的数据源;而SSI不需编程。利用API开发的扩展软件,其运行速度比CGI快,功能也较CGI强;但其操作有一定的风险,出现错误时可能使系统崩溃(CGI程序不会),并且它非常依赖于具体的服务器而移植性太差,开发周期较长。CGI在操作的风险性、软件移植性、软件开发难度等方面较API有优势;其缺点在于CPU负载较高,特别是同时发生的CGI请求很多时,将影响服务器的综合性能。综合比较而言,CGI比其它两种技术更优秀,在实际应用中也最为普遍。



第二部分、CGI程序设计的概念

1.0、CGI程序的功能:

  首先,什么是公共网关接口(CGI)呢?CGI是一个用于定义WEB服务器与外部程序之间通信方式的标准,使得外部程序能生成HTML、图象或者其他内容,而服务器处理的方式与那些非外部程序生成的HTML、图象或者其他内容的处理方式是相同的。因此,CGI程序不仅使你能生成静态内容,而且能生成动态内容。使用CGI的原因在于它是一个定义良好并被广泛支持的标准。虽然,Java、ActiveX等可以完成CGI程序的功能,但并不是所有浏览器都支持它们。相反,所有浏览器都支持CGI,如:Lynx、IE、Netscape等。然而,和其他技术一样,CGI也有它的局限性。本节我就讲述CGI程序的功能、优点与不足。

 1.1、CGI功能

  有许多任务,CGI是最佳的是唯一的选择,这些任务可分为三类:初级任务、中级任务和高级任务。初级任务是一些不用怎么编程的任务,如:文本型计数器,生成简单的HTML的程序,少于50行用Perl语言、Shell脚 本、C语言或C++语言编写的程序这样的任务用CGI来写至少有三点好处:第一、CGI运行最快,而Java等开销太大;第二、CGI标准于当前浏览器最兼容,这一点在前面已经提到;第三、CGI资源丰富,您在Internet上可以找到成千上万的CGI代码。中级任务是包括图象映象和其他一些稍复杂的程序设计任务。在中级任务中,用CGI和Java来编写程序的难易程度差别不大。此类任务包括:图象映象生成整页的HTML的CGI脚本动画.很有特点的是,对于高级任务,用CGI比用Java编程要简单得多。 此类任务有:后端数据库操作,搜索引擎,多重动态页面,其中,后端数据库操作(存取数据库的应用程序)体现了CGI的优越性。CGI有一定的历史,其中很多有用的功能都在CGI的库中由别人做好了;Java 是一种程序设计语言,而CGI是网关程序的功能规范。如果 Java有较大改变, 您得重写整个程序;而CGI有较大变化的,您只要升级CGI库程序即可。然而 CGI在有些方面还是有局限性的。

 1.2、CGI的局限性

  在图象映象和动画方面,CGI程序不如Java程序开发方便。现在Java越来越流行,CGI程序则越来越适合编写简短杂乱的程序和数据库应用程序。

 1.3、CGI程序功能

  CGI程序的最大特点是可以用任何一种语言编制,可运行在任何一种平台上,只要它符合CGI的规范即可。下表是一个比较:
------------------------------------------------
任务 CGI+HTML HTML
处理表单 Yes No
创建WEB页面上
    非静态内容 Yes No
处理图象映象文件 Yes Yes
在WEB页面和文档中搜索 Yes No
创建表单 Yes Yes
创建平台无关的文档 Yes Yes
创建聊天室等交互
    应用程序 Yes No
页面动态生成 Yes No
按用户需要进行
    页面文档裁剪 Yes No
-----------------------------------------------

下面,我们用一系列“Hello World”程序结束本讲:

PERL:
#!Perl

Require "cgi-lib.pl";

print &PrintHeader;

print "\n";

print "Hello World\n";

print &PrintEnv;

exit;

此文件存储在C:\HTTPD\CGI-BIN目录下,文件名为2_1.pl。在浏览器中用地址http://localhost/cgi-bin/2_1.pl调用。注意,此时OmniHTTPD应在运行。如果一切正常,您可以在浏览器中看见“Hello World”和环境变量。

C:
#include

#include "html-lib.h"

#include "cgi-lib.h"

int main()

{
 html_header();

 html_begin("Test CGI");

 h1("CGI Program");

 printf("--------------------------------------------------------------------------------\n");

 h2("CGI Environment Variables");

 print_cgi_env();

 html_end();

 return 0; }

编译后将可执行文件复制到C:\HTTPD\CGI-BIN下,改名为2_1.cgi,用地址http://localhost/cgi-bin/2_1.cgi调用。



[此贴被 Aoming(aoming) 在 09月18日21时37分 编辑过]

地主 发表时间: 06/14 22:07

回复: Aoming [aoming]   版主   登录
NND,每请求一个进程,该淘汰的技术了,mod_perl、FastCGI、VelociGen、PerlEx都比这个强,难过ing~~~




[此贴被 Aoming(aoming) 在 09月18日21时38分 编辑过]

B1层 发表时间: 09/18 20:59

回复: luluhu [luluhu]   论坛用户   登录
C:\HTTPD\CGI-BIN  怎么找不到?
是不是需要安装什么?

B2层 发表时间: 04-02-03 09:20

回复: Aoming [aoming]   版主   登录
httpd\cgi-bin目录其实是你安装了webserver后的一个目录,需要先安装如apache webserver这样的软件后才有,另外要perl程序运行,还需要安装active perl

B3层 发表时间: 04-02-08 11:05

论坛: 网站建设

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号