TIPI 阅读笔记 ----cgi 和 fastcgi
FastCGI是Web服务器和处理程序之间通信的一种协议, 是CGI的一种改进方案,FastCGI像是一个常驻(long-lived)型的CGI, 它可以一直执行,在请求到达时不会花费时间去fork一个进程来处理(这是CGI最为人诟病的fork-and-execute模式)。
fastcgi 的工作流程
1、 Fastcgi 进程管理器自身初始化,启动多个CGI解析器进程,并等待来自Web Server的连接。
2、web 服务器与 FastCGI 进程管理器进行 Socket 通信,通过FastCGI协议发送CGI环境变量和标准输入数据给CGI解释器进程。
3、 CGI 解释器进程完成处理后将标准输出和错误信息从同一连接返回给web server
4、CGI 解释器进程接着等待并处理来自web server的下一个连接。
PHP中的CGI实现
PHP的CGI实现了FastCGI协议,是一个TCP或UDP协议的服务器接受来自Web服务器的请求, 当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期: 模块初始化,sapi初始化,处理PHP请求,模块关闭,sapi关闭等就构成了整个CGI的生命周期。
以TCP为例,在TCP的服务端,一般会执行这样几个操作步骤:
- 调用socket函数创建一个TCP用的流式套接字;
- 调用bind函数将服务器的本地地址与前面创建的套接字绑定;
- 调用listen函数将新创建的套接字作为监听,等待客户端发起的连接,当客户端有多个连接连接到这个套接字时,可能需要排队处理;
- 服务器进程调用accept函数进入阻塞状态,直到有客户进程调用connect函数而建立起一个连接;
- 当与客户端创建连接后,服务器调用read_stream函数读取客户的请求;
- 处理完数据后,服务器调用write函数向客户端发送应答。