CGI,Fastcgi,PHP-FPM 之概念说明和区分

󰃭 2016-07-27

CGI

首先我们要了解什么是CGI: 通用网关接口

那这就引出了另外一个问题, 什么是网关,简单理解就是一个转换器, 可以把Http协议请求转换成Ftp协议并响应给用户,或者Http协议转换成SMTP协议。

通过这种转换,用户就可以直接通过Http协议获取非Http协议的服务器资源了

回到CGI,我们知道, Web Server 可以直接给用户提供网络资源, 但一般都是静态的网络资源,一旦我们需要根据用户请求动态的获取服务器资源的话, 就不太好处理了, 因为Web Server 并不直接提供这种功能

也许我们已经知道了PHP,Python, Java 等等这些语言可以作为动态语言为服务器提供动态资源。的确, 很多动态资源都是依赖这些语言实现的。

Web Server 是如何与这些动态语言交流的呢。

这里就需要预先协定好一套协议, 这个协议可以允许Web Server 把请求正确地传递给动态语言,而动态语言也能正确的将响应返回给Web Server, 再由Web Server 响应给客户端

这里的协议就可以说是一个CGI

FastCgi

一般的CGI 实现时,Web Server 每次与后端的动态语言交流时, 后端都要启动一个进程,接收Web Server的请求,处理然后响应。 这种方式很耗费服务器资源(频繁的创建销毁进程)

于是,FastCgi应运而生.

CGI的实现不同, FastCgi实现时,启动的是一个守护进程, 并启动若干个子进程,这样,Web Server再每次有新的请求发送过来时, 守护进程将请求分配给某个子进程处理并返回,如果再同时有多个新的请求进来, 那这些新的请求也可以被直接分配给其他的子进程

这样,通过预先创建进程的方式减少频繁的进程创建销毁的过程,并提高并发处理能力

总之,FastCgi 也是一种CGI, 只不过实现的机制不同, 但都是协议,帮助Web Server与后端的动态语言交互

PHP-FPM

PHP-FPM 是对 FastCgi 的一种实现, 他在启动后也会创建一个守护进程和若干个子进程,过程就和上面FastCgi的交互一样