聊一聊CGI、FastCGI及FPM

2,660 阅读2分钟

CGI是什么

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

说的简单点,所谓CGI其实就是定义了服务器(如nginx)和处理程序(如PHP)之间该如何进行数据交互的标准。如果没有这个标准,服务器按照自己的方式把数据传给处理程序,那处理程序该如何识别,所以提供了一种各类服务器和各个处理程序都认同的的协议,规定了哪些数据该传递,以什么样的方式传递。

那所谓的数据,又是什么?

这里的数据我认为应该分成两部分。第一部分是:服务器传递给处理程序,这个时候会传递如urlrequest bodyrequest header等信息,PHP解析器(php-cgi)拿到这些信息,进行程序内部的处理。第二部分是:处理程序把响应数据回传给服务器,这个时候的数据就会是response等响应信息、服务器拿到数据后,通过cgi解析,处理完成后,返回给客户端。

CGI就那么完美吗?

答案当然是否定的,每一次的web请求,实现了CGI的进程都会fork一个进程进行处理,当请求处理完之后,就要关闭,这样频繁的对进程进行创建销毁,效率低、处理速度慢,而且当连接数一多,过多的进程就会消耗更多的资源和内存。

FastCGI是什么

FastCGI从根本上来说其实类似于cgi,也是与语言无关的一种协议。是为了解决cgi的频繁创建销毁造成的资源浪费、才孕育而生了FastCGI。

FPM又是什么

FPM或者说是PHP-FPM,官方对FPM的解释是Fastcgi Process Manager(Fastcgi 进程管理器)。在说FPM之前就不得不先说一下,PHP官方推出的php-cgi.

php-cgi虽然是官方出品,但是当修改php.ini文件后,需要重启php-cgi,而且php-cgi不支持平滑重启。

PHP-FPM是非官方出品的,是从php5.3之后加入的,它是对FastCGI协议的具体实现,负责一个进程池来管理web服务器的请求。

CGI、FastCGI、PHP-CGI和PHP-FPM关系图

CGI、FastCGI、PHP-CGI和PHP-FPM关系图