mod_php VS mod_fastcgi
什么是mod_php和mod_fastcgi
在lamp体系中,对于apache端php的配置,我们最常用的就是mod_php, 它把PHP做为APACHE一个内置模块。让apache http服务器本身能够支持PHP语言,不需要每一个请求就启动PHP解释器来解释PHP。
和把webserver与php绑定起来的方式不同,fastcgi是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,相当于一个程序接口。它可以接受来自web服务器的请求,解释输入信息,将处理后的结果返回给服务器(apache,lighty等)。mod_fastcgi就是在apache下支持fastcgi协议的模块。
工作原理
php编程手册在介绍这两种模式的工作原理前,我们先了解一下php的架构
图1 php架构图
上面是php的架构图,从图上可以看到, SAPI提供了一个和外部通信的接口,使得PHP可以和其他应用进行交互数据。php默认提供了很多种SAPI,常见的给apache的mod_php5,CGI,给IIS的ISAPI,还有Shell的CLI。对于一个基于apache的php应用,其运行流程可以简单归结如下
apache -> httpd -> mod_phpfastcgi -> sapi -> php
我们下面提到的两种工作方式就分别用到了mod_php5和cgi的sapi。
mod_php
mod_php是在lamp体系中最常使用的工作方式,在这种模式下,php被编译为apache的一个内置模块,在启动时加载。当有一个php请求过来时,直接在httpd进程里完成php的解释运行,将结果返回。
在php的sapi中,有这样一个函数: sapi_cgibin_ub_write, 这个函数告诉了Zend,如何输出数据。查看mod_php的sapi源码,我们会发现,这个函数直接调用了apache的ap_rwrite函数。所以,用mod_php,我们可以把php和apache看做一个模块,两者绑定在一起。其工
作原理如下图所示
图2 mod_php工作原理
mod_fastcgi
在说明fastcgi之前,先了解一下普通cgi的工作流程:
web server收到用户请求,并把请求提交给cgi程序,cgi程序根据请求提交的参数作应处理,然后输出标准的html语句返回给web server,web server再返回给客户端,这就是普通cgi的工作原理。
fastcgi是基于cgi架构的扩展,他的核心思想就是在web server和具体cgi程序之间建立一个智能的可持续的中间层,统管cgi程序的运行,这样web server只需要将请求提交给这个层,这个层再派生出几个可复用的cgi程序实例,然后再把请求分发给这些实例,这些实例是可控的,可持续,可复用的, 因此一方面避免了进程反复fork,另一方面又可以通过中间层的控制和探测机制来监视这些实例的运行情况,根据不同的状况fork或者回收实例,达到灵活 性和稳定性兼得的目的。modFastCGI的主要优点是把动态语言和web server分离开来。这种技术允许把web server和动态语言运行在不同的主机上,以大规模扩展和改进安全性而不损失生产效率。
基于mod_fastcgi方式的php应用,其典型工作流程如下
图3 mod_fastcgi工作原理
从图上可以看出, apache启动后,mod_fastcgi会在启动多个cgi程序,也就是php-cgi脚本。具体脚本的数目通过配置来指定。当有http请求到来后,httpd进程会选择一个当前空闲的一个php-cgi程序来执行,执行的方式和mod_php类似,也是通过php-cgi提供的sapi完成交互。查看源码,可以发现对于cgi的sapi,和mod_php不同,它是把结果输出到fastcgi提供的stdout上,fastcgi再将数据返回给httpd完成交互。
mod_factcgi的三种配置方式
基于mod_fastcgi的fastcgi应用一共有三种配置方式:静态、动态和远程。他们通过apache配置中的伪指令来代替,对应于三种方式的伪指令分别是FastCgiServer, FastCgiConfig, 以及FastCgiExternalServer。
对于静态和动态这两种方式,apache将通过mod_fastcgi自带的进程管理工具(fcgi-pm)来管理fastcgi应用程序,也就是php-cgi。fcgi-pm在apache启动时就被自动激活了。相对于前两种,远程模式下,php-cgi不由fcgi-pm来管理,apache不会去关心php-cgi程序的状态。
下面详细说一下三种配置方式
静态配置
通过FastCGIServer 伪指令将文件名定义为静态 FastCGI 应用程序。初始时需要指定启动的php-cgi进程数目,默认为1个。apache运行过程中,如果静态应用程序实例因为任何原因死了,那么fcgi-pm将衍生另一个实例来替换。
语法 FastCgiServer file name [options]
重要参数说明
idle-timeout n(30 秒)。在请求异常终止和事件记录在 error LogLevel 前,所允许的 FastCGI 应用程序不活动秒数。仅当存在与 FastCGI 应用程序的暂挂连接时,该不活动计时器才应用。如果应用程序在此期间不响应队列的请求,那么请求异常终止。如果与应用程序的通信完成,但是与客户机的通信未完成(缓存的响应),那么超时不应用。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论