Apache与php解析器通信方式分析(mod_php的apache2hander模块模式与php-fpm的fastcgi管理器模式分析)

Apache与php解析器通信方式分析(mod_php的apache2hander模块模式与php-fpm的fastcgi管理器模式分析)

在apache(Unix平台最流行的WEB服务器平台)之中调用PHP是个经久不衰的话题,目前的PHP存在PHP4和PHP5的版本,而且在apache(Unix平台最流行的WEB服务器平台)之中调用PHP还存在module(模块)方式和CGI方式,同时apache(Unix平台最流行的WEB服务器平台)还存在apache(Unix平台最流行的WEB服务器平台)1和apache(Unix平台最流行的WEB服务器平台)2两个版本.
  在apache(Unix平台最流行的WEB服务器平台)之中调用PHP存在以下八种模式:
  1,PHP4在apache(Unix平台最流行的WEB服务器平台)1的module模式
  2,PHP4在apache(Unix平台最流行的WEB服务器平台)1的cgi模式
  3,PHP5在apache(Unix平台最流行的WEB服务器平台)1的module模式
  4,PHP5在apache(Unix平台最流行的WEB服务器平台)1的cgi模式
  5,PHP4在apache(Unix平台最流行的WEB服务器平台)2的module模式
  6,PHP4在apache(Unix平台最流行的WEB服务器平台)2的cgi模式
  7,PHP5在apache(Unix平台最流行的WEB服务器平台)2的module模式
  8,PHP5在apache(Unix平台最流行的WEB服务器平台)2的cgi模式
  你有没有想过,把这八种调用模式,就在一个配置文件之中给配置出来呢?
  也许你作过,但是没有完全成功,因为这八种模式之间,是不能相互兼容的哦.
  然而,灵活运用apache(Unix平台最流行的WEB服务器平台)的一条指令,将这八种模式乖乖的驯服,收容在一起,就易如反掌了

分析:

1.apache的php module模式

该模式,即用php的module作为解析后缀名为.php的文件中的php code代码,即apache直接集成了php解析引擎到apache的php module模块中。具体执行的时候,在linux系统中是与http的子进程一起执行的。
即来了一个request请求,如果采用prefork作为mpm多重请求分配模式,http主进程开启一个http子进程用来处理请求,该子进程会同时处理该请求的html代码和php代码。
其实该种方法内部也是在cgi的基础上进行开发的一个apache的一个扩展。

2.apache的cgi模式

apache的cgi模式处理php文件(后缀名为.php的文件)中的code代码不是apache自己处理的,而是通过cgi模块作为中间件,来与php进程对接,也就是php的代码是通过php解析进程单独处理的。
比较出名的架构师apache-cgi模块-php-fpm处理器 ,fastcgi协议实现模块(集成为apache的一个模块中,具体执行的时候是通过modphp模块执行的,与http是一个子进程)
apache的cgi模式的几种模块分析介绍
a:cgi协议实现模式,(不太清楚,不建议,因为每次处理一个请求都需要重新初始化一个php处理引擎资源,太消耗资源和时间。cgi是一个协议,建议使用fastcgi协议)
b:fastcig外部实现模式,即proxy代理模块—phpfpm模块(fastcgi协议处理端通过php实现并处理php代码,独立子进程处理,与http子进程分离,模块是php端负责实现)

3.php module模式(apache2hander)与fpm-fcgi模式的比较

Mod_php(php_sapi_name()=apache2hander)无请求状态下测试

http主进程RSS:首次启动13468k,处理过部分请求后13504k

http子进程RSS:首次启动新建空闲子进程6704k,处理过部分请求后9744k

进行5次性能测试(ab -c 80 -n 1000 http://192.168.2.146/info.php)的QPS结果:49.6,60.75,39.47,85.69,50.56

Php-fpm( php_sapi_name()=fpm-fcgi)模式 无请求状态测试

http主进程RSS:首次启动13512k,处理过部分请求后13548k

http子进程RSS:首次启动新建空闲6696k,处理过部分请求后7458k

php-fpm主进程RSS:首次启动10624k,处理过部分请求后10688k

php-fpm子进程RSS:首次启动4556k,处理过部分请求后6836k

进行5次性能测试(ab -c 80 -n 1000 http://192.168.2.146/info.php)的QPS结果:136.58,115.88,82.56,82.85,191.13

分析1 处理速度方向:

理论上来讲mod_php处理模式更快一些(cgi协议应该比mod_php慢,但是fastcgi协议通信貌似与mod_php速度很近,因为cgi协议需要每次处理php请求都需要重新初始化php.ini等配置,处理完一个php请求后,直接关闭进程,下次来请求还需要初始化,很耗时。而fastcgi协议则实现一个fastcgi的子进程初始化一个子进程后,不会关闭,而是持续等待下一个php请求来临,处理完之后,继续等待请求,子进程本身不关闭,也就是不用每次处理一个php请求就初始化一次php.ini配置。),因为mod_php被集成到apache内部,有动态请求需要解析php文件的时候,不需要跨进程去转发请求到php-fpm的fastcgi进程去处理php文件,省去了很多时间。但是我们测试的时候,显然同样的ab压力条件,测试结果是平均php-fpm的每秒钟处理的qps更多。

分析2 内存RSS资源消耗:

理论上来讲,就单个动态请求而言,mod_php的httpd进程的RSS消耗要比php-cgi的模式的httpd进程来讲,mod_php的资源更大一些。但是如果加上php-fpm的消耗的RSS(实测php-fpm每个子进程需要至少4556k左右内存),php-fpm模式的总体消耗比mod_php的模式还要大。这是我们从单个来分析。而对于静态请求而言,对于mod_php模块消耗的内存基本与动态请求一样,apache的加载模块原理,有了请求都会加载mod_php模块初始化。而php-fpm模式初始化的时候,仅仅初始化httpd子进程(实测7458k),无需调用php-fpm子进程处理动态程序,因此php-fpm模式的子进程内存小于mod_php模式的httpd子进程(实测9744k),因此节省了内存。

综述:

对于静态请求,采用php-fpm静态请求比较节省资源,处理速度基本一样(php-fpm模式静态请求大概每个请求节省2m内存,处理速度因为都是仅仅处理静态请求,因此速度类似。);对于动态请求,php-fmp模式比较消耗RSS资源,处理速度可能比mod_php模式慢一些(php-fpm每个动态请求比mod_php大概多出4m内存,处理速度可能比mod_php模式要慢2ms左右,具体没有测试)。
因此,具体问题具体分析,如果静态请求远比动态请求多,从RSS内存和速度方向考虑,采用php-fpm模式比较有优势。如果动态请求远比静态请求多,从RSS内存和速度方向考虑,采用php-fpm模式比较有优势。
注意:具体问题还需要具体分析,因为php-fpm和mod_php的选择因素,还涉及cpu,外围其他架构,如是否做负载均衡等多重因素,因此具体问题需要更深入研究,相互协调进行决策。
And re-edit, after the comment : using CGI or mod_php is up to you : it’s only a matter of configuration of your webserver.

To know which way is currently used on your server, you can check the output of phpinfo() : there should be something indicating whether PHP is running via mod_php (or mod_php5), or via CGI.

You might also want to take a look at the php_sapi_name() function : it returns the type of interface between web server and PHP.

其它参考资料:

Just to add on these answers is that mod_php is the oldest and slowest method available in HTTPD server to use PHP. It is not recommended to use unless you are running old versions of Apache HTTPD and PHP. php-fpm and proxy_cgi are the preferred methods.

Your server needs to have the php modules installed so it can parse php code.

If you are on ubuntu you can do this easily with

sudo apt-get install apache2

sudo apt-get install php5

sudo apt-get install libapache2-mod-php5

sudo /etc/init.d/apache2 restart

Otherwise you may compile apache with php: http://dan.drydog.com/apache2php.html

Specifying your server OS will help others to answer more specifically.

========================================
很高兴加微信讨论相关技术问题:1415035017

发布了31 篇原创文章 · 获赞 0 · 访问量 2820

猜你喜欢

转载自blog.csdn.net/yaqiang2017/article/details/104136986
今日推荐