如果网站的访问量很小,同一韶光仅仅处理单个要求,那么各种结合办法的特点并不能很好的表示。这里我们仅考虑在高访问量、高并发情形下各种结合办法的优缺陷。
CGI:
CGI(common gateway interface)常日翻译为共同网关接口,是HTTP做事器与机器上的其他程序进行通信的一个接口,让Web做事器必要时启动额外的程序处理动态内容。CGI是一种协议,它定义了Webserver与CGI程序的通信办法。Webserver接管客户真个HTTP要求,然后建立进程实行CGI程序,客户真个要求被通报给CGI程序,CGI实行后结果再返回Webserver。 CGI的涌现让WEB从静态变为为动态,随着Web的越来越遍及,很多的网站的都须要有动态的页面,以便与浏览者互交。随着网络技能的发展,CGI办法的缺陷也越来越突出。每次客户端要求都须要建立和销毁进程。由于HTTP要天生一个动态页面,系统就必须启动一个新的进程以运行CGI程序,不断地fork是一项很花费韶光和资源的事情。
FastCGI:
众所周知,CGI阐明器的反复加载是CGI性能低下的紧张缘故原由,如果CGI阐明器保持在内存中 并接管FastCGI进程管理器调度,则可以供应良好的性能、伸缩性、Fail-Over特性等等。
FastCGI是一个常驻型的CGI,可以一贯实行,只要激活后,不会每次都花韶光去fork一次,而且还支持分布式运算(使得php程序阐明实行可以单独交给php做事器),即可以在网站做事器以外的主机上实行并且接管来自其它网站做事器来的要求。
1、Web Server 启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module);
2、FastCGI进程管理器自身初始化,启动多个CGI阐明器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。
3、当客户端要求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI阐明器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。
4、FastCGI子进程完成处理后将标准输出和缺点信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,要求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。 在正常的CGI模式中,php-cgi.exe在此便退出了。
Module:
把php编译为apache的模块,就要考虑apache的MPM的事情模式。
首先我们要理解什么是MPM:
MPM:Multi Path Modules (多道处理模块)用于定义apache在相应多个用户要求时所事情的模型。有三种MPM模式:
prefork(一个要求一个进程相应)
worker(一个要求用一个线程相应,启动多个进程每个进程天生多个线程)
event(一个进程处理多个要求)
以模块安装的php没有独立的进程,是作为apache的模块和apache一起启动的。
以上三种MPM模式,worker模式会比prefork模式霸占更少的内存,高并发下的表现更好。而且利用多进程和多线程稠浊模式,纵然有一个线程挂了,也只影响和该线程同进程的其他线程,不会影响到其他的进程。但是如果有特殊多的线程都利用keep-alive的长连接办法,则线程会一贯被霸占直到超时才开释,导致在高并发场景下无可用线程。而event模式利用了一个专门的线程来处理这些keep-alive类线程,较好的办理了这个问题。
比较:
以CGI办法运行PHP,由于CGI是非常驻内存集,每次Webserver接管客户真个HTTP要求,然后建立进程实行CGI程序,客户真个要求被通报给CGI程序,CGI实行后结果再返回Webserver。 每次浏览页面都要重复上面的动作,会有非常大的花费。
以mod_php模式运行PHP,意味着php是作为apache的一个模块来启动的,因此只有在apache启动的时候会加载扩展模块,在apache运行期间是不会再去读取和加载扩展模块的。显然利用mod_php的办法运行PHP效率比CGI办法更高。
而mod_php与fastcgi比较,俩者都有进程池的观点,但是,fastcgi将做事器端动、静态要求更好的分离。php进程除了问题不会将web做事器也当掉。
末了再对几个名词进行阐明:
php的阐明器是php-cgi。php-cgi只是个CGI程序,只能解析要求,返回结果,不会进程管理,而php-fastcgi是php-cgi的升级版。php-fpm的功能便是能够调度php阐明进程实现进程管理。