当前位置: 首页 > 科技观察

目前PHP常见的五种运行模式

时间:2023-03-21 17:20:40 科技观察

运行模式关于目前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目录中。CERTRecommendationCA-96.11建议不要将任何解释器放在cgi-bin目录中。这种方式的优点是将WebServer与具体的程序处理分开,结构清晰,可控性强。同时缺点是如果访问需求高,CGI进程fork会成为很大的服务器负担,想象一下数百个并发请求导致服务器fork数百个进程你就明白了。这就是为什么CGI一直有低性能和高资源消耗的坏名声。1.2、FastCGI方式FastCGI是CGI的升级版,FastCGI就像一个常驻(long-live)的CGI,可以一直执行,只要激活,每次Fork一次都不会花时间(这是CGI最受批评的fork-and-execute模式)。FastCGI是一种可扩展的高速接口,用于在HTTP服务器和动态脚本语言之间进行通信。大多数流行的HTTP服务器都支持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)当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接到一个CGI解释器。Web服务器将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完全独立于宿主服务器,无论FastCGI怎么宕机,都不会拖垮服务器;3)在性能上,FastCGI将动态逻辑的处理与服务器分离,将繁重的IO处理交给宿主服务器。主机服务器可以专注于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的所有优点,可以在Windows和Linux下以PHP-CLI模式创建支持脚本或系统甚至GUI应用程序的服务器。[优点]1)使用多进程,子进程结束后,由内核负责回收资源;2)使用多进程,子进程异常退出不会导致整个线程退出,父进程仍有机会重建进程;3)一个正则主进程只负责任务分发,逻辑更清晰。我们在Linux下经常使用“php-m”来查看PHP安装了哪些扩展,也就是PHP的命令行运行方式;有兴趣的同学可以输入“php-h”来深入研究这种运行方式。1.4模块模式模块模式以mod_php5模块的形式集成。此时mod_php5模块的作用就是接收Apache传递过来的PHP文件请求,对这些请求进行处理,然后将处理后的结果返回给Apache。如果我们在Apache启动前在其配置文件中配置PHP模块(mod_php5),PHP模块会在Apache启动时通过注册apache2的ap_hook_post_config钩子来启动该模块接受PHP文件请求。除了这种在启动时加载的方式,Apache模块还可以在运行时动态加载,这意味着无需重新编译源代码,甚至无需停止服务器即可扩展服务器。我们需要做的就是向服务器发送信号HUP或AP_SIG_GRACEFUL以告诉服务器重新加载模块。但是在动态加载之前,我们需要将模块编译成动态链接库。此时的动态加载就是加载动态链接库。Apache中对动态链接库的处理是通过模块mod_so来完成的,所以mod_so模块不能动态加载,只能静态编译到Apache的核心中。这意味着它是用Apache启动的。Apache是如何加载模块的?我们以前面提到的mod_php5模块为例。首先我们需要在Apache的配置文件httpd.conf中添加一行:LoadModulephp5_modulemodules/mod_php5.so这里我们使用LoadModule命令,这个命令的第一个参数是模块的名字,名字可以是在模块的源代码中实现。第二个选项是模块所在的路径。如果需要在服务器运行时加载模块,可以向服务器发送信号HUP或AP_SIG_GRACEFUL。收到信号后,Apache将重新加载模块,而无需重新启动服务器。这种运行方式就是我们之前在windows环境下使用apache服务器的方式,在模块化(DLL)中,PHP是和web服务器一起启动运行的。(它是基于CGI的apache的扩展,以加快PHP的运行效率)。1.5ISAPI模式ISAPI(InternetServerApplicationProgramInterface)是微软公司提供的一套面向Internet服务的API接口。一个ISAPIDLL可以在被用户请求激活后一直留在内存中,等待用户的下一次请求,也可以在一个DLL中设置多个用户请求处理函数。另外,ISAPI的DLL应用程序与WWW服务器在同一个进程中,效率明显高于CGI。(由于微软的排他性,只能在windows环境下运行)PHP是Apache的一个模块。Apache服务器启动后,会预先生成多个进程副本,驻留在内存中。一旦有请求发生,这些空闲的子进程会立即被使用处理,这样就不会产生子进程产生的延迟。这些服务器副本在处理完一个HTTP请求后不会立即退出,而是留在计算机中等待下一个请求。对客户端浏览器请求的响应速度更快,性能更高。