CGI和FastCGI的区别

                             CGIFastCGI的区别

 

CGI

首先我们要了解什么是CGI: 通用网关接口,它是Web服务器与外部应用程序(CGI程序)之间传递信息的接口标准当你动态请求web服务器资源的时候,就需要cgi来处理动态语言和web服务器之间的交流,因为web服务器是没办法直接处理动态请求的。

CGI处理Web Server 与后端的动态语言交流时后端都要启动创建一个进程,接收Web Server的请求,处理然后响应,处理完成之后,就会关闭该进程。然后下次有新请求的时候,又会重新创一个进程进行处理。 

那这就引出了另外一个问题, 什么是网关,简单理解就是一个转换器, 可以把Http协议请求转换成Ftp协议/SMTP协议。并响应给用户,通过这种转换,用户就可以直接通过Http协议获取Http协议的服务器资源了

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

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

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

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

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

FastCgi

FastCGI就像是一个常驻(long-live)型的CGI程序,它可以一直运行着,一般的CGI 实现时,Web Server 每次与后端的动态语言交流时, 后端都要启动一个进程,接收Web Server的请求,处理然后响应。 这种方式很耗费服务器资源(频繁的创建销毁进程)

于是,FastCgi应运而生.

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

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

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

PHP-FPM

一个PHP FastCGI管理器,可以调度管理CGI程序,PHP-FPM 是对 FastCgi 的一种实现, 他在启动后也会创建一个守护进程和若干个子进程,过程就和上面FastCgi的交互一样,如果说fastcgi是一种原理理论的话,那么php-fpm则是一种应用,既可以处理请求,也可以管理调度CGI

PHP-CGI

是一个PHP 的解释器它只是个 CGI 程序,是对CGI的一种实现,只能解析请求,返回结果,不会进程管理

总结:

·  CGI:是 Web Server Web Application 之间数据交换的一种协议。

·  FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。

·  PHP-CGI:是 PHP Web Application)对 Web Server 提供的 CGI 协议的接口程序。

·  PHP-FPM:是 PHPWeb Application)对 Web Server 提供的 FastCGI 协议的接口程序,



猜你喜欢

转载自blog.csdn.net/panjiapengfly/article/details/62235546