在搭建 LAMP/LNMP 服务器时,会常常遇到 PHP-FPM、FastCGI和CGI 这几个概念。若是对它们只知其一;不知其二,很难搭建出高性能的服务器。接下来咱们就以图形方式,解释这些概念之间的关系。php
在整个网站架构中,Web Server(如Apache)只是内容的分发者。举个栗子,若是客户端请求的是 index.html,那么Web Server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。html
若是请求的是 index.php,根据配置文件,Web Server知道这个不是静态文件,须要去找 PHP 解析器来处理,那么他会把这个请求简单处理,而后交给PHP解析器。web
当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,而后处理请求,再以CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程。数据库
为了方便理解,如下是对相关概念的简单解释:apache
CGI(Common Gateway Interface)全称是“通用网关接口”,WEB 服务器与PHP应用进行“交谈”的一种工具,其程序须运行在网络服务器上。CGI能够用任何一种语言编写,只要这种语言具备标准输入、输出和环境变量。如php、perl、tcl等。浏览器
WEB服务器会传哪些数据给PHP解析器呢?URL、查询字符串、POST数据、HTTP header都会有。因此,CGI就是规定要传哪些数据,以什么样的格式传递给后方处理这个请求的协议。仔细想一想,你在PHP代码中使用的用户从哪里来的。php框架
也就是说,CGI就是专门用来和 web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(如php-cgi),cgi程序根据请求提交的参数做出对应处理(解析php),而后输出标准的html语句,返回给web服服务器,WEB服务器再返回给客户端,这就是普通cgi的工做原理。性能优化
CGI的好处就是彻底独立于任何服务器,仅仅是作为中间分子。提供接口给apache和php。他们经过cgi搭线来完成数据传递。这样作的好处就是尽可能减小了这两个程序的关联,使他们变得更独立。服务器
可是CGI有个蛋疼的地方,就是每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式,这样一在大规模并发下,就死翘翘了。网络
PHP-CGI的不足:
1)php-cgi变动php.ini配置后需重启php-cgi才能让新的php-ini生效,不能够平滑重启。
2)直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑重新生成新的子进程。)
从根本上来讲,FastCGI是用来提升CGI程序性能的。相似于CGI,FastCGI也能够说是一种协议。
FastCGI像是一个常驻(long-live)型的CGI,它能够一直执行着,只要激活后,不会每次都要花费时间去fork一次。它还支持分布式的运算, 即 FastCGI 程序能够在网站服务器之外的主机上执行,而且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中,并所以得到较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要缘由,若是CGI解释器保持在内存中,并接受FastCGI进程管理器调度,则能够提供良好的性能、伸缩性、Fail-Over特性等等。
FastCGI的工做原理:
FastCGI接口方式采用C/S结构,能够将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。
文字解说:
1)Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
2)FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可建多个php-cgi),并等待来自Web Server的链接。
3)当客户端请求到达Web Server时,FastCGI进程管理器选择并链接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4)FastCGI子进程完成处理后,将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个链接。 在CGI模式中,php-cgi在此便退出了。
FastCGI与CGI特色:
1)对于CGI来讲,每个Web请求PHP都必须从新解析php.ini、从新载入所有扩展,并从新初始化所有数据结构。而使用FastCGI,全部这些都只在进程启动时发生一次。一个额外的好处是,持续数据库链接(Persistent database connection)能够工做。
2)因为FastCGI是多进程,因此比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
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)方式了。
免费php框架性能优化微服务网站架构资料发放,须要评论留言或+V:获取哦