首先CGI是外部应用程序与Web服务器之间的接口标准,是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。php可以作为一个CGI使用,作为CGI时,它将作为独立的进程运行,有请求过来就创建一个进程进行响应。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。(通俗解释:FastCGI是用来提高CGI性能的),FastCGI是如何对进程进行管理的:Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。
PHP-CGI 是PHP的解释器。PHP-CGI只是个CGI程序,他自己本身只能解析请求,返回结果而不能管理进程,所以就出现了一些能够调度PHP-CGI进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。
PHP-FPM是FastCGI进程的管理器,用来管理FastCGI进程的,是一个后台服务,监听端口9000 nginx接受用户的请求,扔给后台的PHP-FPM执行的。修改php.ini之后,PHP-CGI 进程无法平滑重启。PHP-FPM对此的处理机制是新的worker用新的配置,已经存在的worker执行完成后就会释放,通过这种机制来平滑过度。
讲到PHP的底层运行机制不得不解释下PHP进程与线程,请参考文章:PHP的进程与线程详解