CGI和FastCGI都是用于在Web服务器上运行脚本的协议,但它们之间存在一些关键区别。以下是它们的工作原理和主要差异:

1. CGI工作原理:

当客户端发起请求时,Web服务器会请求操作系统创建一个新的CGI解释器进程(如PHP-CGI.exe)。一个CGI进程处理完一个请求后会退出,然后下一个请求到来时再创建新进程。这种方式在访问量较少且没有并发的情况下可以正常工作。然而,当访问量增大且存在并发时,这种方式就不再适用。

2. FastCGI工作原理:

FastCGI类似于一个常驻型的CGI,它可以一直执行,只要激活后,就不会每次都花费时间去fork一次(这是CGI最受诟病的fork-and-execute模式)。一般情况下,FastCGI的工作流程如下:

- Web服务器启动时载入CGI与FastCGI进程管理器(如IIS ISAPI或Apache Module)。

- FastCGI进程管理器自身初始化,启动多个CGI解释器进程(如多个PHP-CGI),并等待来自Web服务器的连接。

- 当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程PHP-CGI。

- FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web服务器。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web服务器中)的下一个连接。在CGI模式中,PHP-CGI在此便退出了。

总结一下,CGI和FastCGI的主要区别在于:

- CGI是一种较早的技术,存在较高的资源消耗和性能问题;而FastCGI是CGI的一种改进方案,具有更好的性能和资源利用率。

- FastCGI采用常驻进程的方式运行,避免了频繁创建和销毁进程带来的开销;而CGI每次请求都需要创建新的进程。