CGI
一. CGI是什么
CGI,全称是Common Gateway Interface,翻译过来就是“通用网关接口”,定义了一个接口标准,描述了数据怎么在服务器和外部应用程序之间怎么传递。二. CGI的来历
在很早之前,互联网只有些静态内容,浏览器发送资源请求,服务器接受请求并返回服务器上的静态文件即可。随着互联网的发展,动态内容产生了,这些动态内容涉及到了数据库,能够操作数据库的动态语言将数据处理后返回给WebServer,WebServer再返回给浏览器。
由于有很多种动态语言和很多种浏览器,它们之间面临着不兼容的情况,这时候就需要在它们之间设立一个接口标准,这就是CGI。浏览器发起请求,WebServer会将请求发给对应的CGI程序,CGI再调用外部程序来处理请求并返回结果。
三. CGI的作用
WebServer是通过如下方式来CGI程序进行通信的,所以只要支持标准输入输出和环境变量的语言,都能用来编写CGI程序。环境变量(请求类型,请求IP..) 标准输入(请求主体) 标准输出(请求响应)
CGI描述了如何在环境变量中传递请求的基本信息,如何通过标准输入传递请求体,以及如何通过标准输出来传递输出。这就使编程语言可以很容易得使用环境变量、标准输入输出
四. CGI的缺点
WebServer在接收到请求时,会先fork出CGI进程,然后处理请求,处理完后结束这个进程,这就是 fork-and-execute 模式。所以用 CGI 方式的服务器有多少连接请求就会有多少 CGI 进程,每个进程都会加载解析PHP配置,初始化执行环境,那么当高并发请求时,会大量挤占系统的资源如内存,CPU 时间等,造成效能低下。PHP-CGI
PHP-CGI是php的CGI程序,不进行进程管理
FastCGI
一. FastCGI的简介
是Web服务器和处理程序之间通信的一种, 是CGI的一种改进方案,像是一个常驻(long-lived)型的CGI, 它可以一直执行,在请求到达时不会花费时间去fork一个进程来处理(这是CGI最为人诟病的fork-and-execute模式)。 正是因为他只是一个通信协议,它还支持分布式的运算,所以 FastCGI 程序可以在网站服务器以外的主机上执行,并且可以接受来自其它网站服务器的请求。FastCGI 是与语言无关的、可伸缩架构的 CGI 开放扩展,将 CGI 解释器进程保持在内存中,以此获得较高的性能。 CGI 程序反复加载是 CGI 性能低下的主要原因,如果 CGI 程序保持在内存中并接受 FastCGI 进程管理器调度, 则可以提供良好的性能、伸缩性、Fail-Over 特性等。
二. FastCGI工作流程
- FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,并等待来自 Web Server 的连接。
- Web 服务器与 FastCGI 进程管理器进行 Socket 通信,通过 FastCGI 协议发送 CGI 环境变量和标准输入数据给 CGI 解释器进程。
- CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。
- CGI 解释器进程接着等待并处理来自 Web Server 的下一个连接。
FastCGI 与传统 CGI 模式的区别之一则是 Web 服务器不是直接执行 CGI 程序了,而是通过 Socket 与 FastCGI 响应器(FastCGI 进程管理器)进行交互,也正是由于 FastCGI 进程管理器是基于 Socket 通信的,所以也是分布式的,Web 服务器可以和 CGI 响应器服务器分开部署。Web 服务器需要将数据 CGI/1.1 的规范封装在遵循 FastCGI 协议包中发送给 FastCGI 响应器程序。