#FastCGI
简介
CGI全称是Common GateWay Interface 通用网关接口,它可以让一个客户端从网页浏览器向执行在Web服务器上的程序请求数据。
CGI描述了客户端和这个程序之间传输数据的一种标准。
CGI的一个目的是要独立于任何语言的,所有CGI可以使用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量,如php、perl、tcl等
FastCGI是Web服务器和处理程序之间通信的一种协议,是CGI的一种改进方案。
FastCGI像是一个常驻型的CGI,可以一直执行,在请求到大时不会花费时间去fork一个进程来处理(这是CGI最为人诟病的fork-and-execute模式)。正式因为他只是一个通信协议,还只是分布式的运算,即FastCGI程序可以在网站服务器意外的主机上执行并且接受来自其他网站服务器的请求
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,将CGI解释器进程保持在内存中,一次获得较高的性能。
CGI程序反复加载是CGI性能地下的主要原因,如果CGI程序保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等
一般情况下,FastCGI的整个工作流程是这样的:
- WebServer启动时载入FastCGI进程管理器(IIS ISAPI或者Apache Module)
- FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自WebServer的链接
- 当客户端请求到达WebServer时,FastCGI进程管理器选择并链接到一个CGI解释器。WebServer将CGI环境变量和标准输入发送到FastCGI子进程php-cgi
- FastCGI子进程完成处理后将标准输出和错误信息从同一个链接返回WebServer,当FastCGI子进程关闭时,请求便告知处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器的下一个链接,在CGI模式,php-cgi在此便退出了
PHP中的CGI实现
PHP的CGI实现了Fastcgi协议,是一个TCP或者UDP协议的服务器接受来自Web服务器的请求,当启动时创建一个TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期:模块初始化、sapi初始化、处理PHP请求、模块关闭、sapi关闭等就构成了整个CGI的声明周期
以TCP为例,在TCP的服务端,一般会执行这样几个步骤操作:
- 调用socket函数创建一个TCP用的流式套接字
- 调用bind函数将服务器的本地地址与前面创建的套接字绑定
- 调用listen函数将新创建的套接字作为监听,等待客户端发起的连接,当客户端有多个连接到这个套接字时,可能需要排队处理
- 当与客户端创建连接购,服务器调用read_stream函数读取客户的请求
- 处理完数据后,服务器调用write函数向客户端发送应答