php在apache下一般有三种工作方式:CGI,Apache模块,FastCGI

在CGI模式下,如果用户请求一个php文件,web服务器就会调用php解析器去解析这个文件,然后把结果返回给客户端。

在apache模块模式下,将php解析器作为了apache的一个模块,这样php解析器就与web服务器一起运行。

在fastcgi模式下,web服务器不会像cgi那样每次都启动一个新的进程,而是将内容传递到一个已有的进程中(这个进程在web服务器启动时就开启了,而且不会退出),这个进程就会一次次的处理来自客户端的请求。

1. CGI模式与模块模式比较:

这两种工作方式的区别:
    在CGI模式下,如果客户机请求一个php文件,Web服务器就调用php解析器去解释这个文件,然后再把解释的结果以网页的形式返回给客户机;而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。
    所以从某种角度上来说,以apache模块方式安装的PHP有着比CGI模式更好的安全性以及更好的执行效率和速度。

2. FastCGI运行模式分析:

FastCGI的工作原理是:

(1)、apache启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】。
(2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程并等待来自Web Server的连接。
(3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。 
(4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi在此便退出了。

在上述情况中,你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些 都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

参考资料:

http://fifiole.blog.163.com/blog/static/169459225201222962651804/

http://blog.csdn.net/ajaxuser/article/details/5892630