关于PHP现在比较常见的五大运转形式:
1)CGI(通用网关接口/CommonGatewayInterface)
2)FastCGI(常驻型CGI/Long-LiveCGI)
3)CLI(命令行运转/CommandLineInterface)
4)Web模块形式(Apache等Web服务器运转的形式)
5)ISAPI(InternetServerApplicationProgramInterface)
备注:在PHP5.3今后,PHP不再有ISAPI形式,装置后也不再有php5isapi.dll这个文件。要在IIS6上运用高版别PHP,必须装置FastCGI扩展,然后使IIS6支撑FastCGI。
1.1、CGI形式
CGI即通用网关接口(CommonGatewayInterface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和Web服务器中的执行程序衔接起来,它把HTML接纳的指令传递给服务器的执行程序,再把服务器执行程序的成果返还给HTML页。CGI的跨渠道功能极佳,几乎能够在任何操作体系上实现。CGI已经是比较老的形式了,这几年都很少用了。
每有一个用户恳求,都会先要创立CGI的子进程,然后处理恳求,处理完后完毕这个子进程,这便是Fork-And-Execute形式。当用户恳求数量非常多时,会很多挤占体系的资源如内存,CPU时刻等,形成效能低下。所以用CGI方法的服务器有多少衔接恳求就会有多少CGI子进程,子进程重复加载是CGI功能低下的主要原因。
假如不想把PHP嵌入到服务器端软件(如Apache)作为一个模块装置的话,能够挑选以CGI的形式装置。或许把PHP用于不同的CGI封装以便为代码创立安全的chroot和setuid环境。这样每个客户机恳求一个PHP文件,Web服务器就调用php.exe(win下是php.exe,linux是php)去解说这个文件,然后再把解说的成果以网页的形式回来给客户机。这种装置方法一般会把PHP的可执行文件装置到web服务器的cgi-bin目录。CERT主张书CA-96.11主张不要把任何的解说器放到cgi-bin目录。这种方法的长处是把WebServer和具体的程序处理独立开来,结构清晰,可控性强,一同缺陷便是假如在高拜访需求的情况下,CGI的进程Fork就会成为很大的服务器担负,想象一下数百个并发恳求导致服务器Fork出数百个进程就理解了。这也是为什么CGI一向担负功能低下,高资源耗费的恶名的原因。
1.2、FastCGI形式
FastCGI是CGI的晋级版别,FastCGI像是一个常驻(long-live)型的CGI,它能够一向执行着,只需激活后,不会每次都要花费时刻去Fork一次(这是CGI最为人诟病的fork-and-execute形式)。
FastCGI是一个可弹性地、高速地在HTTPserver和动态脚本语言间通讯的接口。大都流行的HTTPserver都支撑FastCGI,包括Apache、Nginx和lighttpd等,一同,FastCGI也被许多脚本语言所支撑,其间就有PHP。
FastCGI接口方法采用C/S结构,能够将HTTP服务器和脚本解析服务器分隔,一同在脚本解析服务器上发动一个或许多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,然后将得到的成果回来给浏览器。这种方法能够让HTTP服务器专注地处理静态恳求或许将动态脚本服务器的成果回来给客户端,这在很大程度上提高了整个运用体系的功能。
【原理】
1)WebServer发动时载入FastCGI进程管理器(IISISAPI或ApacheModule);
2)FastCGI进程管理器自身初始化,发动多个CGI解说器进程(可见多个php-cgi.exe或php-cig)并等候来自WebServer的衔接;
3)当客户端恳求到达WebServer时,FastCGI进程管理器挑选并衔接到一个CGI解说器。Webserver将CGI环境变量和规范输入发送到FastCGI子进程php-cgi;
4)FastCGI子进程完结处理后将规范输出和过错信息从同一衔接回来WebServer。当FastCGI子进程关闭衔接时,恳求便告处理完结。FastCGI子进程接着等候并处理来自FastCGI进程管理器(运转在WebServer中)的下一个衔接。在正常的CGI形式中,php-cgi.exe在此便退出了。
在CGI形式中,你能够幻想CGI一般有多慢。每一个Web恳求PHP都必须从头解析php.ini、从头载入悉数dll扩展并重初始化悉数数据结构。运用FastCGI,一切这些都只在进程发动时发作一次。一个额外的长处是,继续数据库衔接(Persistentdatabaseconnection)能够作业。
备注:PHP的FastCGI进程管理器是PHP-FPM(PHP-FastCGIProcessManager)
【长处】
1)从稳定性上看,FastCGI是以独立的进程池来运转CGI,单独一个进程死掉,体系能够很轻易的丢弃,然后从头分配新的进程来运转逻辑;
2)从安全性上看,FastCGI支撑分布式运算。FastCGI和宿主的Server完全独立,FastCGI怎么down也不会把Server搞垮;
3)从功能上看,FastCGI把动态逻辑的处理从Server中分离出来,大负荷的IO处理仍是留给宿主Server,这样宿主Server能够一心一意作IO,关于一个普通的动态网页来说,逻辑处理可能只要一小部分,很多的是图片等静态。
【缺陷】
说完了长处,也来说说缺陷。从我的实际运用来看,用FastCGI形式更适合出产环境的服务器。但关于开发用机器来说就不太适宜。由于当运用ZendStudio调试程序时,由于FastCGI会以为PHP进程超时,从而在页面回来500过错。这一点让人非常恼火,所以我在开发机器上仍是换回了ISAPI形式。对某些服务器的新版别支撑不好,对分布式负载均衡没要求的模块化装置是否是更好的挑选。现在的FastCGI和Server沟通还不行智能,一个FastCGI进程假如执行时刻过长会被当成是死进程杀掉重起,这样在处理长时刻使命的时候很麻烦,这样做也使得FastCGI无法答应联机调试。由于是多进程,所以比CGI多线程耗费更多的服务器内存,PHP-CGI解说器每进程耗费7至25兆内存,将这个数字乘以50或100便是很大的内存数。
1.3CLI形式
PHP-CLI是PHPCommandLineInterface的简称,如同它名字的意思,便是PHP在命令行运转的接口,差异于在Web服务器上运转的PHP环境(PHP-CGI,ISAPI等)。也便是说,PHP不单能够写前台网页,它还能够用来写后台的程序。PHP的CLIShell脚本适用于一切的PHP优势,使创立要么支撑脚本或体系甚至与GUI运用程序的服务端,在Windows和Linux下都是支撑PHP-CLI形式的。
【长处】
1)运用多进程,子进程完毕今后,内核会负责收回资源;
2)运用多进程,子进程反常退出不会导致整个进程Thread退出,父进程还有时机重建流程;
3)一个常驻主进程,只负责使命分发,逻辑更清楚。
咱们在Linux下经常运用”php–m”查找PHP装置了那些扩展便是PHP命令行运转形式;有兴趣的同学能够输入”php–h”去深入研究该运转形式。
1.4模块形式
模块形式是以mod_php5模块的形式集成,此刻mod_php5模块的作用是接纳Apache传递过来的PHP文件恳求,并处理这些恳求,然后将处理后的成果回来给Apache。假如咱们在Apache发动前在其配置文件中配置好了PHP模块
(mod_php5),PHP模块经过注册apache2的ap_hook_post_config挂钩,在Apache发动的时候发动此模块以接受PHP文件的恳求。
除了这种发动时的加载方法,Apache的模块能够在运转的时候动态装载,这意味着对服务器能够进行功能扩展而不需要从头对源代码进行编译,甚至底子不需要停止服务器。咱们所需要做的仅仅是给服务器发送信号HUP或许AP_SIG_GRACEFUL告诉服务器从头载入模块。但是在动态加载之前,咱们需要将模块编译成为动态链接库。此刻的动态加载便是加载动态链接库。Apache中对动态链接库的处理是经过模块mod_so来完结的,因此mod_so模块不能被动态加载,它只能被静态编译进Apache的中心。这意味着它是跟着Apache一同发动的。
Apache是怎么加载模块的呢?咱们曾经面说到的mod_php5模块为例。首先咱们需要在Apache的配置文件httpd.conf中添加一行:
1
LoadModulephp5_modulemodules/mod_php5.so
这儿咱们运用了LoadModule命令,该命令的第一个参数是模块的名称,名称能够在模块实现的源码中找到。第二个选项是该模块所在的途径。假如需要在服务器运转时加载模块,能够经过发送信号HUP或许AP_SIG_GRACEFUL给服务器,一旦接受到该信号,Apache将从头装载模块,而不需要从头发动服务器。
该运转形式是咱们曾经在windows环境下运用apache服务器经常运用的,而在模块化(DLL)中,PHP是与Web服务器一同发动并运转的。(它是apache在CGI的基础上进行的一种扩展,加速PHP的运转功率)。
1.5ISAPI形式
ISAPI(InternetServerApplicationProgramInterface)是微软供给的一套面向Internet服务的API接口,一个ISAPI的DLL,能够在被用户恳求激活后长驻内存,等候用户的另一个恳求,还能够在一个DLL里设置多个用户恳求处理函数,此外,ISAPI的DLL运用程序和WWW服务器处于同一个进程中,功率要明显高于CGI。(由于微软的排他性,只能运转于windows环境)
PHP作为Apache模块,Apache服务器在体系发动后,预先生成多个进程副本驻留在内存中,一旦有恳求出现,就当即运用这些空余的子进程进行处理,这样就不存在生成子进程形成的延迟了。这些服务器副本在处理完一次HTTP恳求之后并不当即退出,而是停留在计算机中等候下次恳求。关于客户浏览器的恳求反响更快,功能较高。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。