1. CGI(Common Gateway Interface)
定义
通用网关接口,是一个协议,是外部应用程序(CGI 程序)与 Web 服务器之间的接口标准,该协议定义了 Web 服务器调用外部应用程序的时候需要输入的参数,和给 Web 服务器的返回结果。它规定一个程序该如何与 Web 服务器程序之间通信,从而可以让这个程序跑在 Web 服务器上。
流程机制
在Web服务器和CGI程序交互时通常使用标准输入输出流(STDIN, STDOUT)和环境变量进行数据传输。每当客户请求 CGI 的时候,WEB服务器就请求操作系统生成一个新的CGI解释器进程,CGI的一个进程则处理完一个请求后退出,下一个请求来时再创建新进程。当访问量增大,这种机制便显现出其劣势,因而促成了FastCGI的诞生。
2. FastCGI(Fast Common Gateway Interface)
定义
快速通用网关接口,是通用网关接口(CGI)的增强版本,由CGI发展改进而来,主要用来提高CGI程序性能,类似于CGI,FastCGI也是一种让交互程序与Web服务器通信的协议。FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求(提高并发访问)。一般说的FastCGI指的也是用各种语言编写的能实现该功能的程序。
流程机制
FASTCGI 是 Web 服务器和语言解释器两者底层的通信协议的规范,是对CGI的开放的扩展。
FastCGI会先 fork 一个 master 进程,解析配置文件,初始化执行环境,然后再 fork 多个 worker 进程(与 Nginx 有点像),当 HTTP 请求过来时,master 进程将其会传递给一个 worker 进程,然后立即可以接受下一个请求,这样就避免了重复的初始化操作,效率自然也就提高了。而且当 worker 进程不够用时,master 进程还可以根据配置预先启动几个 worker 进程等着;当空闲 worker 进程太多时,也会关掉一些,这样不仅提高了性能,还节约了系统资源
3. CGI程序和FastCGI程序的区别
CGI程序
CGI使外部程序与Web服务器之间交互成为可能。CGI程序运行在独立的进程中,并对每个Web请求建立一个进程,这种方法非常容易实现,但效率很差,难以扩展。面对大量请求,进程的大量建立和消亡使操作系统性能大大下降。此外,由于地址空间无法共享,也限制了资源重用。
FastCGI程序
与CGI程序为每个请求创建一个新的进程不同,FastCGI使用持续的进程(master)来处理一连串的请求。这些进程由FastCGI服务器管理,而不是web服务器。 当进来一个请求时,web服务器把环境变量和这个页面请求通过一个socket或者一个TCP connection传递给FastCGI进程。
4. 小结
- CGI 和 FastCGI 都只是一种通信协议规范,不是一个实体,一般说的CGI指的是用各种语言编写的能实现该功能的程序
- CGI 程序和FastCGI程序,是指实现这两个协议的程序,可以是任何语言实现这个协议的。(PHP-CGI 和 PHP-FPM就是实现FastCGI的程序)
5. 参考资源
https://www.cnblogs.com/tssc/...
https://baijiahao.baidu.com/s...