CGI的出现随着IT行业的蓬勃发展,网站变得越来越复杂。90年代出现了动态技术,但是服务器不能直接运行php、asp等文件。如果你自己做不到,就外包给别人。这就需要和外包商建立一个协议:我给你的,你给我的,就是我把请求参数发给你,然后你把你的处理结果返回给我,我再把结??果传给客户端。这个协议就是CGI(commongatewayinterface),中文名称:公共网关接口。该接口可以用C、Perl、PHP、Python等语言实现。在2000年或更早的时候,CGI更受欢迎。当时Perl是编写CGI的主流语言,以至于一般的CGI程序都是Perl程序。CGI,CommonGatewayInterface,是Web服务器与外部应用程序(CGI程序)之间传递信息的接口。通过CGI接口,Web服务器可以将客户端提交的信息传递给服务器端的CGI程序进行处理,最后将结果返回给客户端。也就是说,CGI其实是一种接口标准。我们通常所说的CGI是指CGI程序,即实现了CGI接口标准的程序。某种语言只要有标准输入、输出和环境变量,如Perl、PHP、C等,都可以用来编写CGI程序。CGI只是一种接口协议,而不是一种语言。CGI程序如何工作Web服务器一般只处理静态文件请求,如jpg、htm和html。如果遇到php等动态脚本请求,Web服务器的主进程会fork出一个新的进程来启动CGI程序,即将动态脚本请求交给CGI程序处理。启动CGI程序需要一个读取配置文件、加载扩展等过程,CGI程序启动后会解析动态脚本,然后将结果返回给web服务器,最后由web服务器返回结果给client,fork进程也将关闭。这样,每次用户请求一个动态脚本,Web服务器都必须重新fork一个新的进程来启动CGI程序,CGI程序会处理这个动态脚本,处理完后关闭进程。这种工作方式的效率很低。后来出现了一种更高效的方式:Web服务器内置模块。例如apache的mod_php模块,将php解释器做成一个模块,然后加载到apache服务器中。这样,当apache服务器启动的时候,php模块也会同时启动。当客户端请求一个php文件时,apache服务器不需要fork一个新的进程来启动php解释器,而是直接将php文件交给正在运行的php模块进行处理。显然,这样一来,效率会更高。由于在apache服务器启动时读取php配置文件并加载php模块,所以在apache运行过程中不会重新读取php配置文件。因此,我们每次修改php配置文件,都必须重启apache,新的php配置文件才能生效。FastCGIFastCGI就像一个常驻的CGI程序,它可以一直运行。FastCGI程序也可以部署在与Web服务器不同的主机上,也可以接受来自其他Web服务器的请求。FastCGI也是独立于语言的。它的主要行为是将CGI解释器进程保存在内存中,从而达到高效的性能。众所周知,CGI解释器的重复加载是导致CGI性能不佳的主要原因。FastCGI是一个进程管理工具,在内存中管理CGI进程。FastCGI进程管理器需要单独启动。启动FastCGI后,会生成一个FastCGI主进程和多个子进程(子进程其实就是CGI解释器进程)。当客户端请求Web服务器上的动态脚本时,Web服务器将动态脚本通过TCP协议传递给FastCGI主进程,FastCGI主进程根据情况,并将处理后的结果返回给web服务器,web服务器将结果返回给客户端。客户端请求处理完毕后,FastCGI子进程不会关闭,而是继续等待主进程安排工作任务。可见FastCGI的工作效率是非常高的。
