CGI与FastCGI的区别:公共网关接口与常驻型CGI的全面解析
什么是计算机生成图像

CGI的全称是“通用网关接口”。它是 HTTP 服务器用来与您或其他计算机上的程序“对话”的工具。该程序必须在网络服务器上运行。
CGI可以用任何语言编写,只要该语言具有标准输入、输出和环境变量。如php、perl、tcl等。
什么是 FastCGI
FastCGI 就像一个长寿的 CGI。它可以一直执行。只要激活了,每次都不会花时间去fork(这是CGI最受诟病的fork-and-execute模式)。 )。它还支持分布式计算,即FastCGI程序可以在网站服务器以外的主机上执行,并接受其他网站服务器的请求。
FastCGI 是一种独立于语言的、可扩展架构的 CGI 开放扩展。它的主要行为是将CGI解释器进程保留在内存中,从而获得更高的性能。
众所周知,CGI解释器的重复加载是CGI性能低下的主要原因。如果CGI解释器保留在内存中并接受FastCGI进程管理器调度,它可以提供良好的性能、可扩展性、故障转移功能等。
FastCGI 和 CGI 功能
1. 与CGI一样,FastCGI也是与语言无关的。
2. CGI和FastCGI等进程内应用程序独立于核心Web服务器运行,提供比API更安全的环境。 (API 将应用程序的代码与核心 Web 服务器链接起来,这意味着具有错误 API 的应用程序可能会损坏其他应用程序或核心服务器;恶意 API 的应用程序代码甚至可能窃取另一个应用程序或核心服务器密钥)。
3、FastCGI技术目前支持的语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache、ISS、Lighttpd等流行服务器上也有提供。
4、与CGI一样,FastCGI不依赖于任何Web服务器的内部架构,因此即使服务器技术发生变化,FastCGI仍然保持稳定。
FastCGI 的工作原理
1. Web 服务器启动时加载 FastCGI 进程管理器(IIS ISAPI 或 Apache 模块)。
2. FastCGI进程管理器初始化自身,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
3. 当客户端请求到达Web 服务器时,FastCGI 进程管理器选择并连接到CGI 解释器。 Web 服务器将 CGI 环境变量和标准输入发送到 FastCGI 子进程 php-cgi。
4. FastCGI子进程完成处理后,从同一连接返回标准输出和错误信息到Web Server。当FastCGI子进程关闭连接时,请求被处理。然后,FastCGI 子进程等待并处理来自 FastCGI 进程管理器(在 Web 服务器中运行)的下一个连接。在CGI模式下,php-cgi此时退出。
在上面的例子中,你可以想象CGI通常有多慢。对 PHP 的每个 Web 请求都必须重新解析 php.ini、重新加载所有扩展并重新初始化所有数据结构。使用 FastCGI,所有这一切仅在进程启动时发生一次。另一个好处是持久的数据库连接可以工作。
FastCGI的缺点
因为是多进程,所以比CGI多线程消耗更多的服务器内存。 PHP-CGI 解释器每个进程消耗 7 到 25 MB 的内存。将此数字乘以 50 或 100 就是一个很大的内存量。
什么是 PHP-CGI
PHP-CGI是PHP自带的FastCGI管理器
PHP-CGI 的缺点
1、php-cgi更改php.ini配置后,需要重启php-cgi才能使新的php-ini生效。无法顺利重启。
2、直接杀掉php-cgi进程,php将无法运行。 (PHP-FPM和Spawn-FCGI不存在这个问题,守护进程会平滑地重新生成新的子进程。)
什么是 PHP-FPM
PHP-FPM是一个PHP FastCGI管理器,仅用于PHP,可以下载。
PHP-FPM实际上是PHP源代码的补丁,旨在将FastCGI进程管理集成到PHP包中。它必须修补到您的 PHP 源代码中,并在编译和安装 PHP 后才能使用。
与Spawn-FCGI相比,PHP-FPM有更好的CPU和内存控制,前者容易崩溃,必须用crontab监控,而PHP-FPM则没有这样的麻烦。
PHP5.3.3集成了php-fpm,不再是第三方包。 PHP-FPM提供了更好的PHP进程管理方法,可以有效控制内存和进程,并且可以平滑地重新加载PHP配置。它比spawn-fcgi有更多的优点,因此被正式包含在PHP中。 PHP-FPM可以通过./configure中传递--enable-fpm参数来开启。
什么是 Spawn-FCGI
Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd的一部分。很多人使用Lighttpd的Spawn-FCGI以FastCGI模式进行管理工作,但它有很多缺点。 PHP-FPM的出现在一定程度上缓解了一些问题,但是PHP-FPM的缺点是必须重新编译,这可能对一些已经运行的环境带来相当大的风险(参考)。可以直接在 PHP 5.3.3 PHP-FPM 中使用。
Spawn-FCGI现在已经成为一个独立的项目,更加稳定,也给很多网站的配置带来了方便。很多网站都将其与nginx配对来解决动态网页。