Linux php的运行模式与其相关名词术语


1前言

笔者这几天对apache,lighttpd,nginx 三web服务器进行过压力测试。其中apache 是以apache的模块进行运行,lighttpd与nginx是以fastcgi模式运行。测试的基本结果是apache 反映很慢,并发量不大,容易假死。Cpu消耗大,测试完成后cpu的消耗高居不下。Lighttpd 速度快,并发多,反映很快,cpu消耗少,大概是apache的2-3倍左右。Lighttpd由于配置还是怎么的。一进行压力测试php-cgi进程就崩溃。但可以确定的一点是,内存消耗比较。于是这产生了几个问题:

 1)、apache 为什么会在测试完成会负载还高居不小,而lighttpd会立即降下来?

2)、nginx 的内存为什么会消耗那么大?

3)、nginx 的在压力测试的时候为什么php-cgi进行就崩溃呢?

 2、linux 下php的三种运行模式

          Linux 下php有三种运行模式,第一APACHE2HANDLER 第二 CGI 第三 fastcgi。

    

APACHE2HANDLER是apache 自带运行php的方式。一般以这种方式运行在打印phpinfo函数都会看到下图的内容

\

Apache的工作模式是Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

这个就可以解释为什么apache在压力测试后服务器的负载还高居不下的原因了。生成的进程副本会一直驻存在内存里,等待下下面的请求过来。而这个过程是一个轮询的过程。

1)  CGI是比较老的模式了,这几年都很少用了。cgi方式遇到连接请求先要创建cgi的子进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程。子进程反复加载是cgi性能低下的主要原因。

2)  FastCGI  FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。

 

FastCGI的工作原理

(1)、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)

(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。

(3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

(4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。那什么事php-cgi呢?

3、PHP-CGI

      PHP-CGI是PHP自带的FastCGI管理器。可以对其直接启动。现在不管是lighttpd还是nginx都可以与php-cgi进行组合运行php,其中lighttpd直接组合php-cgi运行php,还算比较稳定,笔者测试过,没出现大的问题,效率都还可以。但nginx跟php-cgi直接组合运行php,这就是个噩梦了,php-cgi进程经常崩溃,而且占用的内存也比较高!这就留下了开篇的第二、第三问题,笔者现在还没想清楚,有知道的请告知我,谢谢!

    PHP-CGI的不足

  1)、php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启

2)、直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)

那么什么事PHP-FPM呢?

 4、PHP-FPM

  PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到.

  PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

  现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。

  PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。使用PHP-FPM来控制PHP-CGI的FastCGI进程

那么什么是Spawn-FCGI呢?

5、Spawn-FCGI

Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险(refer),在php 5.3.3中可以直接使用PHP-FPM了。

Spawn-FCGI目前已经独成为一个项目,更加稳定一些,也给很多Web 站点的配置带来便利。已经有不少站点将它与nginx搭配来解决动态网页、

下面代码是用Spawn-FCGI来控制php-CGI的FastCGI进程了

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-CGI

 

6、总结

   呵呵,可能很多php研发者都不是很了解这些名词的概念,笔者在这之前也不是很清楚。其中spawn-FCGI 与 php-fpm好像也不是直接对fastcgi进行管理,而是对php-cgi进行管理而间接的对fastcgi进行管理。这只是本人的一点愚见,有不同意见的欢迎联系讨论、

 

作者 tengzhaorong

相关内容

    暂无相关文章