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
的交互一样