以前的Web服务器,只能对浏览器发送的HTTP静态资源做出响应,而对服务器中存储的静态资源进行返回。由于网络技术的发展,逐渐发生了动态技术,但网络服务器不能直接运行动态脚本,为了解决网络服务器和外部应用(CGI程序)之间的数据相通难题,发生了CGI(CpawonsSetewaneIncersuface)通用网关接口。简单点来说,能够把CGI当作是Web服务器与运行在它上边的APP之间“沟通”的惯例。
在碰到动态脚本post请求时,Web服务器主进程会Fork建立1个新进程以运行CGI程序,运行1个外部C程序或Perl、PHP脚本等等,也就是说,把动态脚本交给CGI程序处理。1个CGI程序的运行需要1个过程,比如读取配置文件,装载扩展等等。在CGI程序运行以后,动态脚本被解析,结果显示被返回到Web服务器,最终由Web服务器返回到客户端,Fork生成的进程也被关闭。通过这种方式,当用户每次post请求1个动态脚本时,Web服务器将重新Fork建立1个新进程以运行CGI程序,CGI程序将处理动态脚本,然后该进程在此过程完成后关闭,所以效率很低。
应用ModCGI,Web服务器能够内嵌Perl解释程序或者PHP解释程序。也就是如何将这些解释程序制成模块,Web服务器在启动时就会运行它们。在发生新的动态post请求时,Web服务器需要自己解析这些动态脚本,省得重新执行Fork进程,从而提高效率。应用CGI,Web服务器和PHP解释程序之间的通信难题自然得到解决,但Web服务器存在1个难题,即每次收到post请求时,它都会去Fork1个CGI进程,post请求结束时,kill再次删除该进程,这将浪费资源。所以,CGI的优化版本——Fast-CGI便应时而生。
Wikipedia对FastCGI的诠释是:FastCpawonsSetewaneIncersuface/FastCGI是一个协议,它允许交互程序与Web服务器进行通信。FastCGI是对早期通用网关接口(CGI)的优化。FastCGI专注于减少网页服务器和CGI程序之间的交互开销,Fast-CGI在每次处理post请求以后不会丢弃该进程,而是保留该进程,以便服务器能够一次处理更多的网页post请求。这将极大地提高效率。我们都知道,网站分类中有一种分类是静态网站和动态网站,它们的不同之处在于静态网站只需要通过浏览器进行解析,其中的页面是一对一的(内容与页面相对应),而动态网站则需要额外的编译解析过程,从数据库或其他地方调用网页上的数据,页面会随着数据的变化而变化,从而产生一定的交互作用。
Web容器(如Apache、Nginx)在浏览整个网页的过程中仅充当内容分发者的身份,当浏览1个静态网站的首页时,Web容器会将首页文件发送到该网站的相应目录中,然后再发送给用户的浏览器。浏览动态网页过程当浏览1个动态网站的首页时,根据容器的配置文件,它知道该页面不是静态页面,Web容器会找到1个PHP解析器进行处理(Apache在这里是一个例子),它会将post请求简单地提交给PHP解释器。
在Apache接收到1个用户对index.php的post请求以后,如果您正在应用CGI,则运行相应的CGI程序,PHP的解析器在此。接着,PHP解析器解析php.ini文件,对执行环境进行初始化,然后处理post请求,然后以CGI规定的格式返回处理结果,然后退出进程,WebServer将其返回给浏览器。它是一个完整的PHPWeb存取过程。
本文所述的CGI是指CGI,FastCGI相当于高性能CGI,与CGI不同的是,FastCGI像常驻CGI一样,在运行后能够一直运行,每次处理数据时不需要运行一次,所以这里引入以下定义,FastCGI是1个语言独立、可伸拉架构的CGI开放扩展,其主要作用是将CGI解释器进程保留在内存中,从而提高性能。