CGI全程“通用网关接口”,它可以让一个客户端从网页浏览器向执行在Web服务器上的程序请求数据,CGI描述了客户端和这个程序之间传输数据的一种标准。
FastCGI是Web服务器和处理程序之间通信的一种协议,是CGI的一种改进,FastCGI类似一个常驻性的CGI,它可以一直执行,在请求到达时不会花费时间去fork一个进程进来处理。因为他只是一个通信协议,且支持分布式的运算,即FastCGI程序可以在网站服务器以外的主机上执行并接受且接受来自其他网站服务器的请求。
FastCGI是与语言无关的、可伸缩架构的CGI开发扩展,将CGI解释器进程保持在内存当中,可以获得较高的性能。CGI程序反复加载是CGI性能地下的主要原因,如果CGI程序保持在内存中并接收FastCGI进程管理器的调度,则可以提供良好的性能、伸缩性等。
FastCGI大致工作流程:
①Web Service在启动时加载FastCGI进程管理器;
②FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Service的连接;
③当客户端请求到达Web Service时,FastCGI进程管理器选择并链接到一个CGI解释器。Web Service 将CGI环境变量和标准输入发送到FastCGI进程php-cgi
④FastCGI子进程完成处理后将标准输出和错误信息从同一个连接返回Web Service,当FastCGI子进程关闭连接时,请求便处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器的下一个连接。
PHP中的CGI实现:
PHP的CGI实现了FastCGI协议,是一个TCP或UDP协议的服务器接收来自Web服务器的请求,当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后进入PHP的生命周期:模块初始化、sapi初始化、处理PHP请求、模块关闭、sapi关闭等。
以TCP为例,在TCP的服务店,一般会执行的几个操作步骤:
①调用socket函数创建一个TCP用的流式套接字;
②调用bind函数将服务器的本地地址与前面创建的套接字绑定;
③调用listen函数创建新的套接字作为监听,等待客户端发起的连接,当客户端有多个连接连接到这个套接字时,可能需要排队处理;
④服务器进程调用accept函数进入阻塞状态,直到有客户进程调用connect函数从而建立以一个连接;
⑤当与客户端创建连接后,服务器调用red_stream函数读取客户的请求;
⑥处理完数据后,服务器调用weite函数向客户端发送应答。
来源:oschina
链接:https://my.oschina.net/u/4381811/blog/3794953