我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

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

1)CGI(通用网关接口)

2) (常驻 CGI / 长期 CGI)

3)CLI(命令行运行/行)

4)Web模块模式(等待Web服务器运行的模式)

5)ISAPI()

注意:PHP5.3之后PHP不再有ISAPI模式,安装后没有.dll文件。若要在IIS6上使用高版本的PHP,必须安装扩展,然后开启IIS6支持。

1.1. CGI模式

CGI 的全称是通用网关接口( ,简称 CGI)。它是一种程序,通俗地说,CGI 就像是连接网页和 Web 服务器中的执行程序的桥梁,它将 HTML 收到的指令传递给服务器的执行程序,然后服务器执行该程序并将结果返回给 HTML 页面。CGI 具有极强的跨平台性,几乎可以在任何操作系统上实现。CGI 已经是一种较老的模式,近年来已经很少使用。

每次有用户请求时,都会先创建一个CGI子进程,然后处理该请求,处理完后终止子进程,这就是Fork-And-模式。当用户请求数非常大时,会占用大量的内存、CPU时间等系统资源,导致性能低下。所以,一个使用CGI的服务器,有多少个连接请求,就会有多少个CGI子进程。子进程的重复加载是CGI性能低下的主要原因。

如果你不想把PHP嵌入到服务器端软件中(举个例子)并以模块形式安装,那么可以选择以CGI方式安装。或者将PHP与不同的CGI包装器一起使用,为你的代码创建一个安全的环境。这样,每个客户端请求一个PHP文件,Web服务器调用php.exe(win下为php.exe,Linux下为php)解释该文件,然后将解释的结果以网页的形式返回给客户端。这种安装方式通常将PHP可执行文件安装到Web服务器的cgi-bin目录中。CERT建议CA-96.11建议不要在cgi-bin目录中放置任何解释器。这种方式的优点是将Web与具体的程序处理分开,结构清晰,可控性强。同时,缺点是如果有很高的访问需求,CGI进程fork将成为服务器的巨大负担。试想一下,数百个并发请求导致服务器fork数百个进程。 这就是为什么CGI一直因性能低下和资源消耗高而臭名昭著的原因。

1.2. 模式

它是CGI的升级版,就像一个长效的CGI,可以一直执行,只要激活了就可以,不会每次都浪费时间去fork(这是CGI最受诟病的fork-and-模式)。

是 HTTP 与动态脚本语言之间的可扩展、高速通信接口。支持大多数流行的 HTTP,包括、Nginx 等。同时也被许多脚本语言支持,包括 PHP。

接口采用C/S结构,可以将HTTP服务器和脚本解析服务器分离,在脚本解析服务器上启动一个或多个脚本解析守护进程。HTTP服务器每次遇到动态程序时,都可以直接交给进程执行,然后将结果返回给浏览器。这种方式可以让HTTP服务器独占处理静态请求或者将动态脚本服务器的结果返回给客户端,大大提高了整个应用系统的性能。

【原则】

1)Web启动时加载进程管理器(IIS或ISAPI);

2)进程管理器进行自我初始化,启动多个CGI解释器进程(可见多个php-cgi.exe或php-cig)并等待来自Web的连接;

3)当客户端请求到达Web时,进程管理器选择并连接到一个CGI解释器。Web将CGI环境变量和标准输入发送给子进程php-cgi;

4)子进程处理完毕后,标准输出和错误信息将从同一个连接返回到Web。当子进程关闭连接时,请求完成。然后子进程等待并处理来自进程管理器(正在运行)的下一个连接。在普通CGI模式下,php-cgi.exe在这里退出。

在 CGI 模式下,您可以想象 CGI 通常有多慢。对 PHP 的每个 Web 请求都必须重新解析 php.ini、重新加载所有 dll 扩展并重新初始化所有数据结构。使用 ,所有这些操作仅在进程启动时发生一次。额外的好处是持久数据库连接 ( ) 可以工作。

注:PHP 的进程管理器是 PHP-FPM(PHP-)

【优势】

1)从稳定性角度来说,CGI运行在独立的进程池中,如果单个进程死亡,系统可以很方便地将其丢弃,重新分配一个新的进程来运行逻辑;

2)从安全角度来说,支持分布式计算,完全独立于主机,无论主机如何宕机都不会被破坏;

3)从性能角度,将动态逻辑的处理从中分离出来,重负载的IO处理仍然交给主机,让主机专心处理IO。对于普通的动态网页来说,逻辑处理可能只是很小的一部分,其中大量的是静态图片等等。

【缺点】

说完了优点,再说说缺点。从我的实际使用来看,该使用模式比较适合生产环境的服务器。但是不适合开发机。因为在使用Zend调试程序的时候,PHP进程会被认为超时,在页面上返回500错误。这个实在是太烦人了,以至于我在开发机上又切换回了ISAPI模式。有些服务器对新版本的支持不好,不需要分布式负载均衡的模块化安装是更好的选择。现在的系统和通信还不够智能,如果某个进程执行时间过长,就会被杀掉,然后当成死进程重启,在处理长期任务的时候,这个就很麻烦了。这也导致无法允许在线调试。因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每个进程消耗7到25兆内存,这个数字乘以50或100就是很大的内存量了。

1.3 CLI模式

PHP-CLI 是 PHP Line 的缩写,顾名思义,它是 PHP 在命令行上运行的接口,与在 Web 服务器上运行的 PHP 环境(PHP-CGI、ISAPI 等)不同。换句话说,PHP 不仅可以编写前端网页,还可以用于编写后端程序。PHP CLI Shell 集所有 PHP 优点于一身,可以创建脚本或服务器端系统,甚至可以创建 GUI 应用程序,无论是 Linux 还是 都支持 PHP-CLI 模式。

【优势】

1)使用多进程,子进程结束后,内核会负责回收资源;

2)使用多进程,子进程异常退出不会导致整个进程退出,父进程仍然有机会重建进程;

3)一个常驻主进程只负责任务分发,逻辑更加清晰。

在Linux下我们经常使用“php -m”来查看PHP安装了哪些扩展,这就是PHP的命令行运行模式;有兴趣的同学可以输入“php -h”来深入研究运行模式。

1.4 模块模式

模块模式是以模块的形式集成的,此时模块的作用就是接收传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给。如果我们在启动前在其配置文件中配置了PHP模块

(),PHP模块在启动时通过注册的钩子来启动此模块,接受对PHP文件的请求。

除了这种启动时加载的方式,模块还可以在运行时动态加载,也就是说,服务器可以扩展,而不需要重新编译源代码,甚至根本不需要停止服务器。我们需要做的就是向服务器发送HUP信号,或者通知服务器重新加载模块。但在动态加载之前,我们需要将模块编译成动态链接库。此时的动态加载就是加载动态链接库。动态链接库的处理是通过模块来完成的,所以模块不能动态加载,只能静态编译到核心中。也就是说是随核心一起启动的。

如何加载模块呢?我们以前面提到的模块为例,首先我们需要在配置文件httpd.conf中添加一行:

/。所以

这里我们使用命令,命令的第一个参数是模块的名称,该名称可以在模块实现的源代码中找到。第二个选项是模块所在的路径。如果需要在服务器运行时加载某个模块,可以向服务器发送信号HUP或。一旦收到信号,模块就会重新加载,而无需重新启动服务器。

这种运行模式就是我们以前在环境中使用服务器时经常采用的,在模块(DLL)中,PHP 随网站服务器一起启动运行。(它是基于 CGI 的扩展,以加快 PHP 的运行效率)。

1.5 ISAPI 模式

ISAPI( )是微软提供的一套面向服务的API接口,一个ISAPI DLL在被一个用户请求激活后可以驻留在内存中,等待另一个用户请求,一个DLL中还可以设置多个用户请求处理函数,另外ISAPI DLL应用程序与WWW服务器处于同一个进程中,效率明显高于CGI。(由于微软的排他性,只能在环境中运行)

作为PHP的一个模块,服务器在系统启动后会预先生成多个进程副本,并驻留在内存中。一旦有请求发生,这些空余的子进程会立即用于处理,这样就不会出现生成子进程带来的延迟。这些服务器副本处理完一个HTTP请求后并不会立即退出,而是留在电脑中等待下一个请求。对客户端浏览器请求的响应速度更快,性能更高。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/941.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线