通用网关接口

在计算机领域，通用网关接口 (英语：Common Gateway Interface，CGI) 是为提供网络服务而执行控制台应用 (或称命令行界面）的程序，提供于服务器上实现动态网页的通用协议。通常情况下，一次请求对应一个CGI 脚本的执行，生成一个 HTML。

简而言之，一个 HTTP POST 请求，从客户端经由 标准输入 发送数据到一个CGI 程序。同时携带其他数据，例如 URL 路径, HTTP头字段数据，被转换为进程的环境变量。

歷史
最初，CGI是在1993年由美国国家超级电脑应用中心（）为NCSA HTTPd Web服务器开发的。这个Web服务器使用了UNIX shell 环境变量来保存从Web服务器传递出去的参数，然后生成一个运行CGI的独立的进程。

運作
Perl是一个广泛被用來編寫CGI程式的语言，但CGI是獨立於任何語言的。Web服务器无须对语言有任何了解。事实上，CGI程序可以用任何脚本语言或者编程语言实现，只要該语言可以在系统上运行。除Perl外，像Unix shell 脚本, 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及其他编译语言的程序与解释语言程序相比，前者的运行速度更快、对操作系统的负荷更小，使用编译语言程序是可能达到更高执行效率的，然而因为开发效率等原因，在目前直譯語言还是最合适的。

 变通方法 

如果代码只是偶尔改变的话，我们可以在服务器产生一个新的进程在编译代码之前进行处理。有一个例子是FastCGI，当然还包括其它编写的加速器，它会在第一次调用脚本时，在系统的某个地方保存脚本编译过的版本。这样对这个文件以后的请求就会自动转向这个编译过的代码，而不用每次调用脚本解释器来解释脚本。当更改了脚本，加速器的临时缓存会被清空来保证调用的是新的版本的脚本。

另一个方法是直接把解释器放在Web服务器中，这样就无须新建一个进程来执行脚本。Apache服务器有很多这样的模块，像mod_cplusplus 、mod_perl、mod_php、mod_python、mod_ruby、和mod_mono。

 参见 
 FastCGI
 CGI.pm
 简单通用网关接口
 Perl

 参考文献 

 外部链接 
 The CGI/1.1 specification.
 The complete list of CGI variables is at https://web.archive.org/web/20060424143818/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 

Category:全球資訊網