当前位置: 首页 > 后端技术 > PHP

什么是CGI、FastCGI、PHP-CGI、PHP-FPM

时间:2023-03-30 01:23:52 PHP

什么是CGICGI?其程序必须在Web服务器上运行的工具。CGI可以用任何语言编写,只要该语言具有标准输入、输出和环境变量即可。比如php,perl,tcl等什么是FastCGIFFastCGI就像一个常驻(long-live)的CGI,可以一直执行,只要激活,每次fork都不会花时间(这个是最受批评的fork-and-execute模式)。它还支持分布式计算,即FastCGI程序可以在Web服务器以外的主机上执行,并接受来自其他Web服务器的请求。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.WebServer启动时加载FastCGI进程管理器(IISISAPI或ApacheModule)。2、FastCGI进程管理器初始化自身,启动多个CGI解释器进程(可见多个php-cgi),等待与web服务器的连接。3.当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到CGI解释器。Web服务器将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。4.FastCGI子进程完成处理后,标准输出和错误信息会从同一个连接返回给WebServer。当FastCGI子进程关闭连接时,请求被处理。FastCGI子进程然后等待并处理来自FastCGI进程管理器(在Web服务器中运行)的下一个连接。在CGI模式下,php-cgi在这里退出。在上面的例子中,你可以想象CGI通常有多慢。每次web请求PHP都必须重新解析php.ini,重新加载所有扩展并重新初始化所有数据结构。使用FastCGI,所有这些只发生一次,即在进程启动时。一个额外的好处是持久数据库连接(Persistentdatabaseconnection)可以工作。FastCGI的缺点是因为是多进程,所以比CGI多线程消耗更多的服务器内存。PHP-CGI解释器每个进程消耗7到25兆字节的内存。将此数字乘以50或100就是大量内存。Nginx0.8.46+PHP5.2.14(FastCGI)服务器3万并发下,10个Nginx进程启动消耗150M内存(15M10=150M),64个php-cgi进程启动消耗1280M内存(20M64=1280M),加上消耗的内存由系统本身,总内存消耗小于2GB。如果服务器内存小,只能开启25个php-cgi进程,这样php-cgi消耗的总内存只有500M。以上数据摘自Nginx0.8.x+PHP5.2.13(FastCGI)构建比Apache(版本6)好十倍的web服务器。什么是PHP-CGIPPHP-CGI是PHP-CGI的不足,PHP1自带的FastCGI管理器,php-cgi更改php.ini配置后,需要重启php-cgi,使新的php-ini生效影响。无法顺利重启。2、直接杀掉php-cgi进程,php无法运行。(PHP-FPM和Spawn-FCGI没有这个问题,daemon进程会顺利的重新生成新的子进程。)什么是PHP-FPPMHP-FPM是一个PHPFastCGI管理器,只用于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官方收录。可以使用./configure中的–enable-fpm参数启用PHP-FPM。