通用网关接口
通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在網絡服务器上的程序,请求数据。CGI 描述了客户端和服务器程序之间传输数据的一种标准。
目录 |
歷史 [编辑]
最初,CGI 是在 1993 年由美国国家超级电脑应用中心(NCSA)为 NCSA HTTPd web 服务器开发的。这个 Web 服务器使用了 UNIX shell 环境变量 来保存从 Web 服务器传递出去的参数,然后生成一个运行 CGI 的独立的进程。
運作 [编辑]
编程语言 Perl 是一个广泛被用來編寫 CGI 程式的语言,但 CGI 的一个目的是要獨立於任何語言的。Web 服务器无须在这个问题上对语言有任何了解。 事实上,CGI 程序可以用任何脚本语言或者是完全独立编程语言实现,只要这个语言可以在这个系统上运行。 除 Perl 外,像 Unix shell script, Python, Ruby, PHP, Tcl, C/C++, 和 Visual Basic 都可以用来編写 CGI 程序。
实现維基百科編輯的 CGI 程序的一个例子:首先用户代理程序向这个 CGI 程序请求某个名称的条目,如果该条目页面存在,CGI 程序就会去获取那个条目页面的原始数据,然后把它转换成 HTML 并把结果输出给浏览器;如果该条目页面不存在,CGI 程序则会提示用户新建一个页面。所有維基操作都是通过这个 CGI 程序来处理的。
CGI 的工作方式,从 Web 服务器的角度看,是在特定的位置(比如:http://www.example.com/wiki.cgi)定义了可以运行 CGI 程序。当收到一个匹配URL的请求,相应的程序就会被调用,并将客户端发送的数据作为输入。程序的输出会由 Web 服务器收集,并加上合适的檔头,再发送回客户端。
一般每次的 CGI 请求都需要新生成一个程序的副本来运行,这样大的工作量会很快将服务器压垮,因此一些更有效的技术像 mod_perl,可以让脚本解释器直接作为模块集成在 Web 服务器(例如:Apache)中,这样就能避免重复载入和初始化解释器。不过这只是就那些需要解释器的高级语言(即解释语言)而言的,使用诸如 C 一类的编译语言则可以避免这种额外负荷。由于 C 及其他编译语言的程序与解释语言程序相比,前者的运行速度更快、对操作系统的负荷更小,使用编译语言程序是可能达到更高执行效率的,然而因为开发效率等原因,在目前解释性语言还是最合适的。
Workarounds [编辑]
如果代码只是偶尔改变的话,我们可以在服务器产生一个新的进程在编译代码之前进行一下处理。有一个例子是FastCGI,当然还包括其它编写的加速器,它会在第一次调用脚本时,在系统的某个地方保存脚本编译过的版本。这样对这个文件以后的请求就会自动转向这个编译过的代码,而不用每次调用脚本解释器来解释脚本。当更改了脚本,加速器的临时缓存会被清空来保证调用的是新的版本的脚本。
另一个方法是直接把解释器放在 Web 服务器中,这样就无须新建一个进程来执行脚本。Apache服务器有很多这样的模块,像 mod_cplusplus、mod_perl、mod_php、mod_python、mod_ruby、和 mod_mono。
参见 [编辑]
外部链接 [编辑]
- The CGI/1.1 specification.
- The complete list of CGI variables is at http://hoohoo.ncsa.uiuc.edu/cgi/env.html.
- The SCGI protocol is a replacement for the Common Gateway Interface (CGI) protocol.
- mod_cplusplus for Apache
|
||||||||||||||||||||||||||