CGI的全称是“CommonGatewayInterface”,它允许客户端从网络浏览器向网络服务器上执行的程序请求数据。CGI描述了在客户端和程序之间传输数据的标准。CGI的一个目的是独立于任何语言,因此CGI可以用任何语言编写,只要该语言具有标准输入、输出和环境变量即可。如php、perl、tcl等。FastCGI是一种Web服务器与处理程序之间进行通信的协议。它是CGI的改进。FastCGI就像一个驻留的(长期存在的)CGI。它可以一直执行,并且不会在请求到达时花费。分叉一个进程来处理(这是最受批评的CGI分叉和执行模式)。正因为它只是一种通信协议,所以它还支持分布式计算,即FastCGI程序可以在Web服务器以外的主机上执行,并接受来自其他Web服务器的请求。FastCGI是一个独立于语言、可扩展的CGI开放扩展,它将CGI解释器进程保存在内存中以实现更高的性能。CGI程序的重复加载是导致CGI性能低下的主要原因。如果CGI程序保存在内存中并被FastCGI进程管理器接受,它们可以提供良好的性能、可伸缩性和故障转移特性。一般情况下,FastCGI的整个工作流程如下:当WebServer启动时,加载FastCGI进程管理器(IISISAPI或ApacheModule)。FastCGI进程管理器初始化自身并启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web服务器的连接。当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。FastCGI子进程完成处理后,它会从同一连接向Web服务器返回标准输出和错误消息。当FastCGI子进程关闭连接时,请求被处理。FastCGI子进程然后等待并处理来自FastCGI进程管理器(在Web服务器中运行)的下一个连接。在CGI模式下,php-cgi在这里退出。PHP的CGI实现了Fastcgi协议。它是一个TCP或UDP协议服务器,接受来自Web服务器的请求。当它启动时,它会为TCP/UDP协议服务器创建一个socketmonitor,并接收相关的请求进行处理。接着就进入了PHP的生命周期:模块初始化、sapi初始化、处理PHP请求、模块关闭、sapi关闭等,构成了整个CGI生命周期。以TCP为例,在TCP服务器端,一般执行以下步骤:调用socket函数创建TCP流套接字;调用bind函数将服务器的本地地址绑定到之前创建的socketSet上;调用listen函数将新创建的socket作为监听器,等待客户端发起的连接。当客户端有多个连接连接到这个socket时,可能需要排队;服务器进程调用accept函数进入阻塞状态,直到客户端进程调用connect函数建立连接;当与客户端建立连接后,服务端调用read_stream函数读取客户端的请求;处理完数据后,服务端调用write函数向客户端发送响应。PHP的FastCGI使您所有的php应用程序都通过mod_fastci而不是mod_phpsusexec运行。FastCGI应用程序速度很快,因为它们是持久的并且不必在每次请求时都启动和初始化。这使得应用程序的开发成为可能,否则这些应用程序在CGI范例中是不切实际的(例如大型脚本,或者需要连接到单个或多个数据库的应用程序)。FastCGI的优点:PHP脚本运行速度更快(3到30倍)。PHP解释器加载到内存中,而不是每次需要时都从内存中读取,大大提高了依赖脚本运行的站点的性能。需要使用更少的系统资源。由于服务器不需要每次都加载PHP解释器,所以可以在不增加CPU负担的情况下,将站点的传输速度提高到很高。无需更改现有代码。现有的一切都适用于PHP的FastCGI。但是还有一个潜在的问题:您只有一个php.ini文件可用于所有子目录(/home/USERNAME/public_html/php.ini)。这是优化网站代码所必需的。如果您需要多个php.ini文件来满足不同的脚本需求,您可以在任何子目录中禁用PHP的快速CGI,而其余的将继续工作。如果您需要这样做,请联系支持人员。您对PHP环境所做的任何升级(例如对php.ini文件的更改)都会有几分钟的延迟。这是因为您的php.ini文件已经加载到内存中以获得更快的速度,而不是每次需要时都从内存中重新读取。
