网上关于FastCGI和mod_php的知识比较杂乱,不够全面,这里整理一下,方便初学者。背景PHP最常见的方式是作为模块(mod_php)运行在Apache中,这也是Apache默认运行PHP的方式;但是在Nginx中,Nginx使用的是PHP-FPM,但是什么是PHP-FPM呢??它与php有什么关系?今天一起来一探究竟。PHP处理器(PHPhandlers)首先需要记住的是,任何一种网络服务器(Apache、Nginx等)都是为了向用户发送html和图片等静态资源而设计的,网络服务器本身无法解释任何动态脚本。(PHP、Python等)。PHP处理器用于解释Web应用程序中的PHP代码,将其解释为HTML或其他静态资源,然后将解析结果传递给Web服务器,最后由Web服务器发送给用户。大多数Web服务器都不能解析PHP代码,所以需要一个能够解析PHP代码的程序,这就是PHP处理器。现在我们知道Apache和Nginx都需要一个PHP处理器来处理php代码,那么如何连接服务器和php处理器呢?换句话说,服务器如何与php处理器通信?答案是通过SAPI(服务器应用程序编程接口)。简单来说,SAPI就是指PHP具体应用的编程接口。就像个人电脑一样,不管安装的是什么操作系统,只要符合个人电脑的接口规格,就可以在个人电脑上正常运行。执行PHP脚本的方式有很多种,可以通过Web服务器,也可以直接在命令行下执行,也可以嵌入到其他程序中。有兴趣的可以研究一下PHP内核。这里继续讨论PHP最常用的SAPI提供的两种连接方式:mod_php和mod_fastcgi。再来回顾一下mod_php模式,Apache是??如何识别php代码的呢?您是否在Apache配置文件httpd.conf中添加或修改了以下行://AddLoadModulephp5_modulemodules/libphp5.soAddTypeapplication/x-httpd-php.php//ModifyDirectoryIndexindex.php索引。htmlindex.htmindex.html,即php作为Apache的子模块运行。当通过web访问php文件时,Apache会调用php5_module来解析php代码。配置加载mod_php模块后,php本身就是Apache进程的一部分,每一个新的Apache子进程都会加载这个模块。对于mod_fastcgi模式,我们先看看PHP-FPM官网上的描述:PHP-FPM-AsimpleandrobustFastCGIProcessManagerforPHPPHP-FPM(FastCGIProcessManager)是一种替代PHPFastCGI的实现,带有一些对任何规模的网站,尤其是繁忙的网站。PHP-FPM是一个PHPFastCGI进程管理器,解释非常简单。这说明PHP-FPM是工作在辅助mod_fastcgi模式下,但是FastCGI是什么?正在管理什么过程?什么是CGI?CGI(CommonGatewayInterface)是WWW技术中最重要的技术之一,具有不可替代的重要地位。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是CGI程序与Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序并将其输出发送到Web浏览器。CGI将Web上的一组简单的静态超媒体文档变成了一个全新的交互式媒体。说白了,CGI就是外部应用程序(CGI程序)和Web服务器之间的一种协议。CGI是为了保证Server传过来的数据是标准格式的。什么是FastCGI?FastCGI就像一个常驻(long-live)的CGI,可以一直执行,只要激活,每次fork都不会花时间(这是CGI最被诟病的fork-and-execute模式).它还支持分布式计算,即FastCGI程序可以在Web服务器以外的主机上执行,并接受来自其他Web服务器的请求。FastCGI是一个开放的CGI扩展,具有独立于语言、可扩展的体系结构。它的主要行为是将CGI解释器进程保存在内存中,从而获得更高的性能。众所周知,CGI解释器的重复加载是导致CGI性能低下的主要原因。如果CGI解释器保存在内存中并接受FastCGI进程管理器调度,它可以提供良好的性能、可扩展性、Fail-Over特性等。总的来说,FastCGI的整个工作流程如下:WebServer启动时加载FastCGI进程管理器(IISISAPI或ApacheModule)。FastCGI进程管理器初始化自己,启动多个CGI解释器进程(可见多个php-cgi),等待WebServer的连接。当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。FastCGI子进程完成处理后,它会从同一连接向Web服务器返回标准输出和错误消息。当FastCGI子进程关闭连接时,请求处理完成,然后FastCGI子进程等待并处理来自FastCGI进程管理器(运行在WebServer中)的下一个连接。在CGI模式下,php-cgi在这里退出。也就是说,FastCGI是CGI的升级版,是一种独立于语言的协议,用于程序(如PHP、Python、Java)和Web服务器(Apache2、Nginx)之间的通信。理论上,任何语言编写的程序都可以通过FastCGI访问。提供网络服务。FastCGI的特点是会在一个进程中依次完成多个请求,以达到提高效率的目的。大多数FastCGI实现都会维护一个进程池。通俗解释:FastCGI需要提前启动,可以启动多个CGI模块,一直运行等待web发送请求,然后解析计算php。完成后生成html返回给web,但是完成后不会退出,而是继续等待下一个web请求。PHP-FPPMPHP-FPM是FastCGI的PHP实现。它负责管理一个进程池来处理来自网络服务器的请求。但是PHP-FPM只是一个“PHPFastCGI进程管理器”,它仍然会调用PHP解释器本身来处理请求,PHP解释器(Windows下)是php-cgi.exe。总结说了这么多,不知道能不能表达清楚。如果我错了请指正,谢谢。原文:http://article.gitos.cn/2015/Aurthur/PHP-Mod-PHP-And-Fast-CGI-Explain.html作者:Aurthur