1)、CGI
CGI全称“公共网关接口”(Common Gateway Interface),是HTTP服务器与其它机器上的程序进行通信的接口,其程序须运行在网络服务器上。
2)、FastCGI
FastCGI是一个常驻型的CGI,它可以一直执行,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。我们知道,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保存在内存中并接受FastCGI进程管理器调度,那么就可以提供良好的性能、伸缩性等。
缺点:
因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
原理:
1. Web服务器启动时,载入FastCGI进程管理器;
2. FastCGI进程管理器初始化,启动多个CGI解释器进程(PHP-CGI)并等待来自Web服务器的连接;
3. 当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器,Web服务器将CGI环境变量和标准输入发送到FastCGI子进程PHP-CGI。
4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回给Web服务器。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web服务器中)的下一个连接。而在CGI模式中,PHP-CGI在此便退出了。
在上述情况中,可以想象CGI通常有多慢,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。另外,数据库持久连接可以工作。
先说最经典的php运行模式,就是apache mod模式,这种模式下,php是作为apache的一个模块而活着的,这就是最早期的LAMP模式。这会儿只要是配置apache配置,将php mod加载进来后重启apache服务即可。值得注意的是,php的运行权限将跟随apache的运行权限。apache收到php请求后,是交给php mod处理完再返回给apache即可。
fast-cgi模式,这种模式下,就是所谓的LNMP模式了。fast cgi是一种协议,任何脚本语言都可以遵循这种协议,不仅局限于php。只要语言本身可以解析fast cgi协议就可以。php的fast cgi协议是通过fpm进程管理器来实现的,而fpm则是一种master多slave的进程模型。fpm作为daemon服务一旦启动后,将会常驻内存,通过这个来提高性能,那么,之后就该说一下cgi了。然而,此时http服务器往往会搭配nginx,其实就是nginx通过默认端口在9000的fpm进行通信,通信协议就是靠的fastcgi!明白了吧
cgi模式,比fast cgi少了一个fast。这种模式下的php性能比较低劣,单进程的,php收到请求后将会启动一个cgi进程,解析完毕php脚本后将结果返回给客户端,这个cgi进程就会销毁掉,一旦请求量大了,性能非常低劣。所以,知道fast cgi的常驻内存为什么比cgi牛逼了吧。
cli模式,这种模式下的php极具高性能生产环境价值!cli模式有一个很大的好处就是可以使php程序常驻内存,可以实现多进程。如果有一些定时任务,定时脚本什么的,完全可以使用php的cli模式来实现,建议大家私下都多尝试尝试这种模式。比如workerman、swoole都是基于php的cli模式下实现的。