在搭建 LAMP/LNMP 服务器时,会经常遇到 PHP-FPM、FastCGI和CGI 这几个概念。如果对它们一知半解,很难搭建出高性能的服务器。接下来我们就以图形方式,解释这些概念之间的关系。
1、基础
如果请求的是 index.php,根据配置文件,Web Server知道这个不是静态文件,需要去找 PHP
解析器来处理,那么他会把这个请求简单处理,然后交给PHP解析器。
所以,以上的apache调用php执行的过程如下:
apache -> httpd -> php5_module -> sapi -> php
好了。apache与php通过php5_module的方式就搞清楚了吧!
这种模式将php模块安装到apache中,所以每一次apache结束请求,都会产生一条进程,这个进程就完整的包括php的各种运算计算等操作。
在上图中,我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求,可想而知,如果一旦用户过多,并发数过多,服务器就会承受不住了。
而且,把mod_php编进apache时,出问题时很难定位是php的问题还是apache的问题。
3、CGI
- CGI(Common Gateway Interface)全称是“通用网关接口”,WEB 服务器与PHP应用进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php、perl、tcl等。
4、FastCGI介绍
1)FastCGI简单介绍
2)FastCGI的工作原理
PHP-CGI就是PHP实现的自带的FastCGI管理器。
虽然是php官方出品,但是这丫的却一点也不给力,性能太差,而且也很麻烦不人性化,主要体现在:
php-cgi变更php.ini配置后,需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
直接杀死php-cgi进程,php就不能运行了。 上面2个问题,一直让很多人病垢了很久,所以很多人一直还是在用 Module 方式。 直到
2004年一个叫 Andrei Nigmatulin的屌丝发明了PHP-FPM ,这神器的出现就彻底打破了这种局面,这是一个PHP专用的
fastcgi 管理器,它很爽的克服了上面2个问题,而且,还表现在其他方面更表现强劲。
也就是说,PHP-FPM 是对于 FastCGI
协议的具体实现,他负责管理一个进程池,来处理来自Web服务器的请求。目前,PHP5.3版本之后,PHP-FPM是内置于PHP的。
因为PHP-CGI只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理。所以就出现了一些能够调度 php-cgi
进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。同样,PHP-FPM也是用于调度管理PHP解析器php-cgi的管理程序。
PHP-FPM通过生成新的子进程可以实现php.ini修改后的平滑重启。
所以,如果要搭建一个高性能的PHP WEB服务器,目前最佳的方式是Apache/Nginx + FastCGI + PHP-FPM(+PHP-CGI)方式了,不要再使用 Module加载或者 CGI 方式啦:)
再次感谢原作者啦!真的写的很全面,转载也是我了很好的保存!
https://www.awaimai.com/371.html