PHP的四种运行模式

PHP的四种运行模式

1、CGI
2、FAST-CGI
3、CLI
4、模块模式(Apache等web服务器运行的模块模式)


一、CGI(Common Gateway Interface)

CGI即通用的网关接口(Common Gateway Interface),它可以让客户端通过浏览器向web服务器上的程序请求数据,是客户端与程序之间传输数据的一种标准,通俗的来讲就像是一座桥,一头是客户端,一头是服务器端,把客户端与web服务器之间的程序连接起来,把HTML的接收的指令传给服务器的执行程序,再把服务器执行的结果返回给HTML。另外CGI的独立于任何语言,所以可以用任何语言去编写,只要这种语言有标准输入、输出和环境变量,如php,perl,tcl等。

CGI针对每个请求都要先创建一个cgi的子进程,激活这个cgi进程,然后处理请求,处理完请求之后结束这个进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少个cgi子进程,子进程反复加载是cgi性能低下的主要原因。当用户的请求数量很多的时候,子进程会反复加载,从而占用内存、CPU时间等,造成性能低下。

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、FAST-CGI

fast-cgi是cgi升级版本,我们知道了上边的cgi的消耗很大,如果有很多的请求,则会申请很多的子进程。这个时候就有了FastCGI,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次(这是 CGI 最为人诟病的 fork-and-execute 模式)。这也是当下用到的最多的运行模式 环境LNMP(linux+nginx+php+mysql)。

FastCGI的工作原理是:
PHP使用PHP-FPM (FastCGI Process Manager)全称PHP FastCGI进程管理器进行管理;
FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自WebServer的连接;
当客户端请求达到Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi;
FastCGI进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告知处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web server中)的下一个连接。如果是正常的CGI模式中,php-cgi在此便退出了;

三、CLI

cli是PHP的命令行运行模式,dli端的运行命令有时会很有用,总结几个:
查看php版本信息:php -v
查看php当前的扩展:php -m
查看php.ini的配置信息(相当于使用phpinfo() 函数):php -ini
查看php的函数:php --rf date
检测php代码:php -l xxx.php

四、模块(module)

module模式一般应用在Apache中,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,是以mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,一旦有请求出现,就立即使用这些mod_php5模块的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。

PHP的运行原理

想要了解php的运行原理,我们先来看一下php的四层体系;

PHP 的核心架构如下图所示:
PHP的四种运行模式
从上图可以看出,php从下到上分为四层:
(1)Zend 引擎(核心)
Zend 引擎整体用C语言实现,是 PHP 的内核部分,它负责将 PHP 代码翻译(词法、语法解析等一系列编译过程)为可执行的 opcode 操作码,并实现相应的处理方法、基本的数据结构(如 hashtable、OO)、内存分配及管理、提供相应的 API 方法供外部调用。

Zend 是一切的核心,所有的外围功能均围绕 Zend 实现。

(2)Extensions(扩展)
围绕着 Zend 引擎,Extensions 通过组件化的方式提供各种基础服务,我们常见的各种内置函数(例如变量操作函数、字符串操作函数等)以及标准库等都是通过 Extensions 来实现。

用户也可以根据需要实现自己的 Extension 组件以达到功能扩展、性能优化等目的,这就是高手常说的“编写 PHP 扩展”。
(3) SAPI(服务器应用程序编程接口)
SAPI 全称是 Server Application Programming Interface,译为“服务器应用程序编程接口”。
SAPI 通过一系列钩子函数,使得 PHP 可以和外围交互数据,这是 PHP 非常优雅和成功的一个设计,通过 SAPI 成功的将 PHP 本身和上层应用解耦隔离,PHP 可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

(4)Application(上层应用)
这就是我们平时编写的 PHP 程序,通过不同的 SAPI 方式得到各种各样的应用模式,例如通过 Web 服务器实现网站后台、在命令行下以脚本方式运行等。(也就是我们上边所说的运行模式)

PHP的执行流程&opcode

PHP的四种运行模式

发送请求 ,将PHP代码转换为语言片段
将tokens转换为简单而有意义的表达式
将表达式编译成opcode
顺次执行opcode时,从而实现PHP脚本的功能

运行模式和运行原理的区别

多个运行模式相当于超市的不同入口,运行原理就进入超市固定的行走路线(到货架上拿到商品-》走到收银台-》结账),我们就是通过不同的运行模式进入最底层(进入超市)。


文章:以上就是PHP的运行模式及运行原理,感谢各位大佬的阅读、点赞、评论支持,希望可以帮助到你们。我是 敲码农的小Bug 我们下期见

上一篇:php的SAPI,CLI SAPI,CGI SAPI


下一篇:一次php请求过程图解