mod_php VS mod_fastcgi
目录
什么是MOD_PHP和MOD_FASTCGI ................................................. 1 工作原理..................................................................... 2
MOD_PHP ..................................................................... 2 MOD_FASTCGI ................................................................. 3
MOD_FACTCGI的三种配置方式 ................................................... 4 静态配置................................................................... 5 动态配置................................................................... 5 远程方式................................................................... 6 PHP-FPM...................................................................... 6 性能测试..................................................................... 8 名称解释................................................................... 8 测试内容................................................................... 8 测试结果................................................................... 8 FASTCGI配置项对性能的影响。 ................................................ 11 分析&结论................................................................... 13 附录 ....................................................................... 14 APACHE+MOD_FASTCGI+PHP搭建 .............................................. 14
什么是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的架构
图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应用,其典型工作流程如下