CGI、PHP-CGI、FastCGI

CGI

一. CGI是什么
CGI,全称是Common Gateway Interface,翻译过来就是“通用网关接口”,定义了一个接口标准,描述了数据怎么在服务器和外部应用程序之间怎么传递。

二. CGI的来历
在很早之前,互联网只有些静态内容,浏览器发送资源请求,服务器接受请求并返回服务器上的静态文件即可。

随着互联网的发展,动态内容产生了,这些动态内容涉及到了数据库,能够操作数据库的动态语言将数据处理后返回给WebServer,WebServer再返回给浏览器。

由于有很多种动态语言和很多种浏览器,它们之间面临着不兼容的情况,这时候就需要在它们之间设立一个接口标准,这就是CGI。浏览器发起请求,WebServer会将请求发给对应的CGI程序,CGI再调用外部程序来处理请求并返回结果。

CGI、PHP-CGI、FastCGI_第1张图片
Paste_Image.png

三. 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的简介
FastCGI是Web服务器和处理程序之间通信的一种协议, 是CGI的一种改进方案,FastCGI像是一个常驻(long-lived)型的CGI, 它可以一直执行,在请求到达时不会花费时间去fork一个进程来处理(这是CGI最为人诟病的fork-and-execute模式)。 正是因为他只是一个通信协议,它还支持分布式的运算,所以 FastCGI 程序可以在网站服务器以外的主机上执行,并且可以接受来自其它网站服务器的请求。

FastCGI 是与语言无关的、可伸缩架构的 CGI 开放扩展,将 CGI 解释器进程保持在内存中,以此获得较高的性能。 CGI 程序反复加载是 CGI 性能低下的主要原因,如果 CGI 程序保持在内存中并接受 FastCGI 进程管理器调度, 则可以提供良好的性能、伸缩性、Fail-Over 特性等。

二. FastCGI工作流程

  1. FastCGI 进程管理器自身初始化,启动多个 CGI 解释器进程,并等待来自 Web Server 的连接。
  2. Web 服务器与 FastCGI 进程管理器进行 Socket 通信,通过 FastCGI 协议发送 CGI 环境变量和标准输入数据给 CGI 解释器进程。
  3. CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回 Web Server。
  4. CGI 解释器进程接着等待并处理来自 Web Server 的下一个连接。

FastCGI 与传统 CGI 模式的区别之一则是 Web 服务器不是直接执行 CGI 程序了,而是通过 Socket 与 FastCGI 响应器(FastCGI 进程管理器)进行交互,也正是由于 FastCGI 进程管理器是基于 Socket 通信的,所以也是分布式的,Web 服务器可以和 CGI 响应器服务器分开部署。Web 服务器需要将数据 CGI/1.1 的规范封装在遵循 FastCGI 协议包中发送给 FastCGI 响应器程序。

你可能感兴趣的:(CGI、PHP-CGI、FastCGI)