CGI,FastCGI,PHP-CGI,PHP-FPM重识

CGI,FastCGI,PHP-CGI,PHP-FPM


之前研究了下一次完整的Web请求涉及到的过程,今天在学Java的JSP的时候就突然想起来想好好总结一下PHP的CGI有关的知识,之前看过好几遍CGI但是过一段时间总是忘记,又由于重新学习了一遍Web协议,这次再看也许会焕然一新。

CGI出现原因

浏览器通过http协议向服务器请求一个资源时,如果这个请求是静态(图片,html,mp3,pdf…),我们的HTTP
Server(Nginx,Apache)能直接根据地址通过HTTP相应(Response)请求。但是我们访问的资源不可能只是静态的,如果是想访问动态的资源时怎么处理呢?Nginx服务器本身是处理不了的,他只能交给(应用服务器)Application Server来处理。但有一个问题Nginx服务器怎么和应用服务器通信呢,大家互相都不认识。为了解决这个问题,CGI就出现了。

CGI

通用网关接口(Common Gateway Interface/CGI)是一种重要的互联网技术,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序请求数据。CGI描述了服务器和请求处理程序之间传输数据的一种标准。

上面是Wiki上关于CGI的解释,也就是说他是一种协议。
我们看下CGI的特点,接着上面的当HTTP Service(nginx,Apache)接收到请求处理index.php的时候,他把这个请求交给了实现了CGI协议的CGI解释器进程,接下来解释器进程会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。下一个请求来时再创建新进程。这里存在一个问题就是当我执行完index.php后我想访问next.php时会重复前面的解析php.ini文件,初始化执行环境而且每次请求的时候他会启动一个进程,当多个请求同时来的时候会同时启动多个进程会给服务器带来压力。
综上CGI解释器进程的缺点是做一些重复工作,进程进来执行完后退出,利用率低。为了解决这几个问题出现了新的协议CGI的升级版Fast-CGI

Fast-CGI

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

PHP-CGI

一开始一看名字我以为PHP-CGI是一个实现CGI协议的CGI进程,但其实不是,他是实现了FastCGI协议的进程。PHP-CGI是PHP内置的,PHP本身应该是没有实现CGI协议的进程(因为这个太落后了)。

PHP-CGI与PHP-FPM一样,也是一个fastcgi进程管理器,PHP-CGI的问题在于 1、PHP-CGI变更php.ini配置后需重启PHP-CGI才能让新的php-ini生效,不可以平滑重启 2、直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。) 针对PHP-CGI的不足,PHP-FPM应运而生。

PHP-FPM

PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,使用PHP-FPM来控制PHP-CGI的FastCGI进程,它负责管理一个进程池,来处理来自Web服务器的请求。可以在 http://php-fpm.org/download 下载得到。

特点:

PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载。使用PHP-FPM可以使PHP有不小的性能提升。PHP-FPM控制的进程CPU回收的速度比较慢,内存分配的很均匀。

参考

  1. WEB请求处理三涉及到CGI部分
  2. segmentfault尹川的回答

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×