一、运行模式 php
关于PHP目前比较常见的五大运行模式: linux
1)CGI(通用网关接口 / Common Gateway Interface) web
2)FastCGI(常驻型CGI / Long-Live CGI) 数据库
3)CLI(命令行运行 / Command Line Interface) apache
4)Web模块模式(Apache等Web服务器运行的模式) windows
5)ISAPI(Internet Server Application Program Interface) api
备注:在PHP5.3之后,PHP再也不有ISAPI模式,安装后也再也不有php5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,而后使IIS6支持FastCGI。 浏览器
1.1 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一直背负性能低下,高资源消耗的恶名的缘由。
1.2 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就是很大的内存数。
1.3 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"去深刻研究该运行模式。
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中添加一行: LoadModule php5_module modules/mod_php5.so
这里咱们使用了LoadModule命令,该命令的第一个参数是模块的名称,名称能够在模块实现的源码中找到。第二个选项是该模块所处的路径。若是须要在服务器运行时加载模块,能够经过发送信号HUP或者AP_SIG_GRACEFUL给服务器,一旦接受到该信号,Apache将从新装载模块,而不须要从新启动服务器。
该运行模式是咱们之前在windows环境下使用apache服务器常用的,而在模块化(DLL)中,PHP是与Web服务器一块儿启动并运行的。(它是apache在CGI的基础上进行的一种扩展,加快PHP的运行效率)。
1.5 ISAPI模式
ISAPI(Internet Server Application Program Interface)是微软提供的一套面向Internet服务的API接口,一个ISAPI的DLL,能够在被用户请求激活后长驻内存,等待用户的另外一个请求,还能够在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。(因为微软的排他性,只能运行于windows环境)
PHP做为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出现,就当即使用这些空余的子进程进行处理,这样就不存在生成子进程形成的延迟了。这些服务器副本在处理完一次HTTP请求以后并不当即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。