CGICGI,CommonGatewayInterface,是HTTP服务器与其他服务器上的程序联系的工具,可用于任何具有标准输入、标准输出和环境变量的语言,例如PHP、Perl或Tcl。FastCGIFastCGI是一种长期存在的CGI,它将始终运行。使用FastCGI,它会花费更少的时间tfork(这是CGI中fork-and-execute模式的问题)。此外,FastCGI还支持分布式计算。它也与语言无关,是CGI的开放扩展,用于让CGI在内存中运行。众所周知,CGI的加载一直是性能低下的主要原因。运行FastCGI的主要过程:Web服务器启动时加载FastCGI的进程管理器(IISISAPI或Apache模块)FastCGI的进程管理器将启动自己创建几个CGI进程,用于等待Web的连接服务器。当客户端的请求到达Web服务器时,FastCGI的进程管理器会选择一个之前设置的CGI进行连接,其环境变量和标准输入将被发送到FastCGI的子进程php-cgi。该子进程将将标准输出和错误信息返回到具有相同连接的Web服务器。请求在关闭连接时完成。因此,FastCGI只设置一次解析php.ini,加载扩展和初始化所有数据结构。捷径因为多进程,FastCGI会比CGI消耗更多的内存,每个进程(PHP-CGI)将花费大约7Mb到25Mb内存。文章中的数据:Nginx0.8x+PHP5.2.13(FastCGI)比Apache(Edition6)好10倍当并行发生30k连接时,10个Nginx进程将仅花费150MbMem(15Mb10),64个PHP-CGI只需要1280Mb(20Mb64).PHP-CGIPHP-CGI是FastCGI的ProcessManager的一种,which在php本身。启动命令如下:php-cgi-b127.0.0.1:9000shortcutsAfterchangingphp.ini,youshouldrebootPHP-CGItomakethenewphp.iniwork.WhenaPHP-CGIprocess被kill掉,所有的PHP代码都无法运行。(PHP-FPM和Spawn-FCGI没有同样的问题)PHP-FPMPHP-FPM是FastCGI的另一种ProcessManager,可以在这里下载。其实是一个patchforPHP,用于将FastCGI的进程管理器集成到PHP中,5.3.2版本之前应该打入PHP。PHP-FPM可以用来控制PHP-CGI的子进程:/usr/local/php/sbin/php-fpm[options]#options--start:启动一个php的fastcgi进程--stop:强制杀掉一个php的fastcgi进程--quit:平滑杀掉一个php的fastcgi进程--restart:重启一个fastcgi进程php的进程--reload:smooth重新加载php.ini--logrotate:重新启用日志文件Spawn-FCGISpawn-FCGI是Fast的ProcessManagerCGI,它是lighttpd的一部分。首先我们要明白CGI是干什么用的?CGI是为了保证web服务器传过来的数据是一个标准的数字,方便CGI程序的编写者。Web服务器(如nginx)只是内容的分发者。例如,如果请求/index.html,Web服务器将在文件系统中找到此文件并将其发送到浏览器,浏览器将分发静态数据。那么,如果当前请求是index.php,根据配置文件,nginx知道这不是一个静态文件,需要到php解析器去处理,那么它就简单处理请求,交给PHP解析器。nginx会将哪些数据传递给php解析器?url必须有,querystring也必须有,POST数据也必须有,HTTPheader也不能少。那么,CGI就是一个协议,规定了传输哪些数据,以什么格式传递给后方来处理这个请求。仔细考虑您在PHP代码中使用的用户来自哪里。当web服务器收到/index.php的请求后,会启动相应的CGI程序,也就是PHP解析器。接下来,PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,将处理后的结果以CGI指定的格式返回,并退出进程。然后网络服务器将结果返回给浏览器。我理解CGI是一种协议,与进程无关。那么什么是fastcgi呢?Fasecgi用于提高CGI程序的性能。提高性能,那么CGI程序的性能问题在哪里呢?“PHP解析器将解析php.ini文件并初始化执行环境”,就是这样。标准的CGI会对每个请求文件执行这些步骤(不累!启动过程很累!),所以处理每个请求的时间会比较长。这显然是不合理的!那么Fastcgi是怎么做到的呢?首先,Fastcgi会启动一个master,解析配置环境,初始化执行环境,然后启动多个worker。当请求进来时,master将其传递给worker,然后worker可以立即接受下一个请求。这样一来,避免了重复劳动,效率自然就高了。而当worker不够用的时候,master可以根据配置预先启动几个worker等待;当然,当空闲的worker过多时,会停止一些,这样既提高了性能又节省了资源。这就是fastcgi的进程管理。那么PHP-FPM是什么?它是一个实现Fastcgi的程序,被PHP官方接受。众所周知,PHP的解释器是php-cgi。php-cgi只是一个CGI程序。它只能解析请求并返回结果。它不管理进程(陛下,妃子真的不行!)所以有一些程序可以调度php-cgi进程。例如,spawn-fcgi与lighthttpd分开。嗯,PHP-FPM也是这么个东西。经过长时间的发展,逐渐被大家所认可(要知道,前几年大家都在抱怨php-fpm稳定性差),并且越来越流行。好了,终于可以回答你的问题了。网上有人说fastcgi是一个协议,php-fpm就是实现了这个协议。有的说php-fpm是fastcgi进程的manager,用来管理fastcgi进程的对。php-fpm的管理对象是php-cgi。但是不能说php-fpm是fastcgi进程的manager,因为前面说fastcgi是一个协议,好像没有这个进程,即使php-fpm存在也无法管理(至少目前)。有人说php-fpm是php内核的patch,之前是对的。因为php-fpm一开始并没有包含在php内核中,所以要使用这个功能,需要找到和源码版本相同的php-fpm给内核打补丁,然后编译。后来php内核集成php-fpm后,就方便多了,用--enable-fpm编译参数就可以了。有人说修改了php.ini配置文件后,没办法顺利重启,于是php-fpm诞生了。是的,修改php.ini后,php-cgi进程没有办法顺利重启。php-fpm对此的处理机制是新的worker使用新的配置,现有的worker处理完手头的工作就可以休息了。通过这种机制,过渡变得平滑。还有人说php-cgi是php自带的FastCGImanager,那为什么还要搞一个php-fpm呢?php-cgi只是一个解释php脚本的程序。如何让php更好的支持php-fpmphp-fpm提供了更好的php进程管理方式,可以有效的控制内存和进程,并且可以平滑的重新加载php配置。您可以在./configure中使用-enable-fpm参数启用php-fpm。修改nginx配置文件,支持php-fpm安装完nginx后,修改nginx配置文件为nginx.conf,在server部分添加如下配置,否则会出现Noinputfilespecified。错误将PHP脚本传递给侦听127.0.0.1:9000location~.php${roothtml;fastcgi_pass127.0.0.1:9000;fastcgi_indexindex.php;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;includefastcgi_params;}启动php-fpm而nginx/usr/local/php/sbin/php-fpm手动打补丁的启动方式/usr/local/php/sbin/php-fpm启动sudo/usr/local/nginx/nginx
