PHP运行模式

        PHP的几种运行模式:

        1、CGI    (通用网关接口/ Common Gateway Interface)

        2、FAST-CGI    (常驻型CGI / Long-Live CGI)

        3、CLI 命令行模式    (命令行运行 / Command Line Interface)

        4、模块模式(Apache等web服务器运行的模块模式)

                LoadModule【Apache独有】

                ISAPI(Internet Server Application Program Interface)【IIS独有】

        备注:在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。


        查看当前运行模式

echo php_sapi_name();


一:CGI(Common Gateway Interface)

        1)、CGI模式通用网关接口(Common Gateway Interface),它允许web服务器通过特定的协议与应用程序通信,通俗的讲CGI就像是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器执行程序,再把服务器执行程序返回给HTML页。CGI的跨平台性能极佳,几乎可以在任何操作系统上实现。

        2)、调用过程:Fork-And-Execute模式 

        用户请求 —> web服务器接收请求【常用Nginx、apache】—> fork CGI的子进程&处理请求 —-> 请求处理完毕,返回结果到web服务器&销毁子进程 —> web服务器返回结果给用户。由于每次用户请求,都得fork创建进程调用一次程序,然后销毁进程,所以性能较低

        优势:作为PHP最早的运行模式,每次请求都独立处理,调用过程足够简单清晰,可控性强进程间是隔离的,保证数据不会被污染。

        劣势:每次请求都需要fork一个新的CGI子进程,假如同一时间并发请求一千,意味着就要fork一千个子进程,这就会导致几个问题:

        fork子进程需要时间,需要占用内存【copy-on-write】

        子进程过多,会导致CPU将大量的时间花费在上下文切换上

        每次请求需要重新加载相关资源


二:FAST-CGI

        1)、FastCGI是CGI的升级版本,FastCGI是一个常驻 (long-live)型的 CGI,在启动web服务器的时候载入FastCGI进程管理器【PHP-FPM、IIS ISAPI、Apache Module】,当有请求过来的时候,web服务器只需要交给FastCGI进程管理器处理即可。

        2)、调用过程:以 PHP-FPM 为例 

        web服务器启动的时候 启动 PHP-FPM master进程(主要负责分配请求给空闲的自子进程处理)以及一定数量的fast-cgi子进程(负责处理请求)。 

        PHP-FPM master进程管理一个进程池,池里有若干个fast-cgi子进程,每个fast-cgi子进程单独处理一个请求,互不干涉。

        用户请求 —> web服务器接收请求【常用Nginx、apache】—> 检测到是PHP请求&转发给FPM master进程 —> FPM master进程 指定空闲fast-cgi子进程处理请求 —> 子进程载入文件(如php.ini)及其他资源处理请求 —> 处理结束&清除资源,结果返回master & 子进程挂起,标记为空闲—> master 将结果返回web服务器 —> web服务器返回结果给用户

        优势: 

        从稳定性上看,FastCGI是以独立的进程池来运行CGI,单独一个进程死掉,系统可以很轻易地丢弃,然后重新分配新的进程来运行逻辑 

        从安全性上看,FastCGI和宿主的web Server完全独立,FastCGI 不会影响web 服务器的运行【如果PHP-FPM处于关闭状态,则会返回502 bad gateway 给用户】 

        从性能上看,FastCGI把动态逻辑的处理从 web Server中分离出来,大负荷的IO处理还是留给宿主Server,这样宿主Server可以一心一意作IO【对于一个普通的动态网页来说, 逻辑处理可能只有一小部分,更多的是图片等静态资源的加载】


        劣势:

        一个fast-cgi子进程同一时间只能处理一个请求,所以网站的并发性能就受限于子进程数量

        如果开启的进程过多,会导致CPU将大量的时间浪费在进程的上下文切换上。

        每次请求fast-cgi子进程都需要重新加载相关资源,请求结束需要释放资源


三:CLI(命令行运行 / Command Line Interface)

        php-cli模式属于命令行模式,对于很多刚开始学php就开始wamp,wnmp的开发者来说是最陌生的一种运行模式 该模式不需要借助其他程序,直接输入php xx.php 就能执行php代码。

        命令行模式和常规web模式明显不一样的是:

        没有超时时间

        默认关闭buffer缓冲

        STDIN和STDOUT标准输入/输出/错误 的使用

        echo var_dump,phpinfo等输出直接输出到控制台

        可使用的类/函数 不同

        出错时输出纯文本的错误信息(非 HTML 格式)。

        CLI SAPI 强制覆盖了 php.ini 中的某些设置,因为这些设置在外壳环境下是没有意义的。


四:模块模式

        LoadModule(Apache独有)

        模块模式是以mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。

        在Apache配置文件httpd.conf里,通常加的LoadModule php7_module “D:/…/php71/php7apache2_4.dll”起到的作用就是这个。

        调用过程: 

        用户请求 —> Apache 服务器 —> 调用mod_php5模块处理请求 —> 返回请求结果给Apache —> Apache 返回结果给用户


        ISAPI(Internet Server Application Program Interface)

        在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。要在IIS6上使用高版本PHP,必须安装FastCGI 扩展,然后使IIS6支持FastCGI。



        配置编译PHP时加参数--enable-maintainer-zts则编译出的php为Zend线程安全(ZTS),否则不是线程安全(NTS)。

        当使用pthread(POSIX threads)扩展时,或者当web服务器为Apache2 mpm-worker或IIS使用PHP作为模块时,请考虑使用ZTS。当使用FastCGI / FPM或Apache2 mpm-prefork时,您不需要ZTS,因为在PHP运行时使用的多进程处理。


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论