关于PHP现在比较罕见的五大运转情势:
(1)CGI(通用网关接口/ Common Gateway Interface)
(2)FastCGI(常驻型CGI / Long-Live CGI)
(3)CLI(敕令行运转 / Command Line Interface)
(4)Web模块情势(Apache等Web效劳器运转的情势)
(5)ISAPI(Internet Server Application Program Interface)
备注:在PHP5.3今后,PHP不再有ISAPI情势,装置后也不再有php5isapi.dll这个文件。要在IIS6上运用高版本PHP,必需装置FastCGI 扩大,然后使IIS6支撑FastCGI。
一、CGI情势
CGI即通用网关接口(Common Gateway Interface),它是一段顺序,浅显的讲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 目次。这类体式格局的长处是把Web Server和细致的顺序处置惩罚自力开来,构造清晰,可控性强,同时瑕玷就是假如在高接见需求的情况下,CGI的历程Fork就会成为很大的效劳器累赘,设想一下数百个并发请求致使效劳器Fork出数百个历程就邃晓了。这也是为何CGI一向背负机能低下,高资本斲丧的恶名的缘由。
相干引荐:《php入门教程》
二、FastCGI情势
FastCGI是CGI的升级版本,FastCGI像是一个常驻 (long-live)型的 CGI,它能够一向实行着,只需激活后,不会每次都要消费时刻去 Fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 情势)。
FastCGI是一个可伸缩地、高速地在HTTP server和动态剧本语言间通讯的接口。多半盛行的HTTP server都支撑FastCGI,包含Apache、Nginx和lighttpd等,同时,FastCGI也被很多剧本语言所支撑,个中就有PHP。
FastCGI接口体式格局采纳C/S构造,能够将HTTP效劳器和剧本剖析效劳器离开,同时在剧本剖析效劳器上启动一个或很多个剧本剖析保卫历程。当HTTP效劳器每次碰到动态顺序时,能够将其直接交付给FastCGI历程来实行,然后将获得的效果返回给浏览器。这类体式格局能够让HTTP效劳器专注地处置惩罚静态请求或许将动态剧本效劳器的效果返回给客户端,这在很大程度上提高了悉数运用体系的机能。
【道理】
(1)Web Server启动时载入FastCGI历程管理器(IIS ISAPI或Apache Module);
(2)FastCGI历程管理器本身初始化,启动多个CGI诠释器历程 (可见多个php-cgi.exe或php-cig)并守候来自Web Server的衔接;
(3)当客户端请求抵达Web Server时,FastCGI历程管理器挑选并衔接到一个CGI诠释器。Web server将CGI环境变量和规范输入发送到FastCGI子历程php-cgi;
(4)FastCGI子历程完成处置惩罚后将规范输出和毛病信息从统一衔接返回Web Server。当FastCGI子历程封闭衔接时,请求便告处置惩罚完成。FastCGI子历程接着守候并处置惩罚来自FastCGI历程管理器(运转在 WebServer中)的下一个衔接。在一般的CGI情势中,php-cgi.exe在此便退出了。
在CGI情势中,你能够设想CGI一般有多慢。每一个Web请求PHP都必需从新剖析php.ini、从新载入悉数dll扩大并重初始化悉数数据构造。运用FastCGI,一切这些都只在历程启动时发作一次。一个分外的长处是,延续数据库衔接(Persistent database connection)能够事情。
备注:PHP的FastCGI历程管理器是PHP-FPM(PHP-FastCGI Process Manager)
【长处】
(1)从稳定性上看,FastCGI是以自力的历程池来运转CGI,零丁一个历程死掉,体系能够很随意马虎的抛弃,然后从新分配新的历程来运转逻辑;
(2)从平安性上看,FastCGI支撑分布式运算。FastCGI和宿主的Server完整自力,FastCGI怎样down也不会把Server搞垮;
(3)从机能上看,FastCGI把动态逻辑的处置惩罚从Server中分离出来,大负荷的IO处置惩罚照样留给宿主Server,如许宿主Server能够专心致志作IO,关于一个一般的动态网页来讲, 逻辑处置惩罚能够只要一小部分,大批的是图片等静态。
【瑕玷】
说完了长处,也来讲说瑕玷。从我的实际运用来看,用FastCGI情势更适合生产环境的效劳器。但关于开辟用机械来讲就不太适宜。因为当运用 Zend Studio调试顺序时,因为 FastCGI会以为 PHP历程超时,从而在页面返回 500毛病。这一点让人非常恼火,所以我在开辟机械上照样换回了 ISAPI情势。对某些效劳器的新版本支撑不好,对分布式负载平衡没请求的模块化装置是不是是更好的挑选。现在的FastCGI和Server沟通还不够智能,一个FastCGI历程假如实行时刻太长会被当做是死历程杀掉重起,如许在处置惩罚长时刻使命的时刻很贫苦,如许做也使得FastCGI没法许可联机调试。因为是多历程,所以比CGI多线程斲丧更多的效劳器内存,PHP-CGI诠释器每历程斲丧7至25兆内存,将这个数字乘以50或100就是很大的内存数。
三、CLI情势
PHP-CLI是PHP Command Line Interface的简称,犹如它名字的意义,就是PHP在敕令行运转的接口,区分于在Web效劳器上运转的PHP环境(PHP-CGI,ISAPI等)。 也就是说,PHP不单能够写前台网页,它还能够用来写背景的顺序。 PHP的CLI Shell剧本适用于一切的PHP上风,使建立要么支撑剧本或体系以至与GUI运用顺序的效劳端,在Windows和Linux下都是支撑PHP-CLI情势的。
【长处】
(1)运用多历程,子历程完毕今后,内核会担任接纳资本;
(2)运用多历程,子历程非常退出不会致使悉数历程Thread退出,父历程另有时机重修流程;
(3)一个常驻主历程,只担任使命分发,逻辑更清晰。
我们在Linux下常常运用"php –m"查找PHP装置了那些扩大就是PHP敕令行运转情势;有兴致的同砚能够输入"php –h"去深入研究该运转情势。
四、模块情势
模块情势是以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中增加一行:
LoadModule php5_module modules/mod_php5.so
这里我们运用了LoadModule敕令,该敕令的第一个参数是模块的称号,称号能够在模块完成的源码中找到。第二个选项是该模块所处的途径。假如需要在效劳器运转时加载模块,能够经由过程发送信号HUP或许AP_SIG_GRACEFUL给效劳器,一旦接收到该信号,Apache将从新装载模块,而不需要从新启动效劳器。
该运转情势是我们之前在windows环境下运用apache效劳器常常运用的,而在模块化(DLL)中,PHP是与Web效劳器一同启动并运转的。(它是apache在CGI的基础上举行的一种扩大,加速PHP的运转效力)。
五、ISAPI情势
ISAPI(Internet Server Application Program Interface)是微软供应的一套面向Internet效劳的API接口,一个ISAPI的DLL,能够在被用户请求激活后长驻内存,守候用户的另一个请求,还能够在一个DLL里设置多个用户请求处置惩罚函数,另外,ISAPI的DLL运用顺序和WWW效劳器处于统一个历程中,效力要明显高于CGI。(因为微软的排他性,只能运转于windows环境)
PHP作为Apache模块,Apache效劳器在体系启动后,预先生成多个历程副本驻留在内存中,一旦有请求涌现,就马上运用这些空余的子历程举行处置惩罚,如许就不存在生成子历程形成的延迟了。这些效劳器副本在处置惩罚完一次HTTP请求以后并不马上退出,而是停留在计算机中守候下次请求。关于客户浏览器的请求回响反映更快,机能较高。
以上就是php有几种运转情势的细致内容,更多请关注ki4网别的相干文章!