谈PHP基本架构和运行生命周期

PHP 的基本架构

谈 PHP 的四层架构

 

从图上可以看出,PHP从下到上是一个4层体系:

  • Zend 引擎:Zend 整体用纯 C 实现,是 PHP 的内核部分。
    • 将 PHP 代码翻译(词法、语法解析等一系列编译过程)为可执行 opcode 处理,并实现相应的处理方法
    • 实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕Zend实现
  • Extensions:围绕着 Zend 引擎,extensions 通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如 array 系列)、标准库等都是通过 extension 来实现,用户也可以根据需要实现自己的 extension以达到功能扩展、性能优化等目的
  • Sapi:Sapi 全称是 Server Application Programming Interface(服务端应用编程接口),Sapi通过一系列钩子函数,使得PHP可以和外围交互数据,这是PHP非常优雅和成功的一个设计,通过 sapi 成功的将PHP本身和上层应用解耦隔离,PHP可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式
  • Application:这就是我们平时编写的PHP程序,通过不同的 sapi 方式得到各种各样的应用模式,如通过 webserver 实现 web 应用、在命令行下以脚本方式运行等等

如果PHP是一辆车,那么车的框架就是PHP本身,Zend是车的引擎(发动机),Ext下面的各种组件就是车的轮子,Sapi可以看做是公路,车可以跑在不同类型的公路上,而一次PHP程序的执行就是汽车跑在公路上。因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道。

PHP 代码的执行流程

从上图可以看出 PHP 实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后 Zend 虚拟机顺次执行这些指令完成操作。
 

PHP 的生命周期

我们平时接触的最多的是 web 模式(也称 CGI 模式)下的 php ,当然你也肯定知道 php 还有个 CLI 模式。 其实无论哪种模式,PHP的工作原理都是一样的, 都是作为一种 SAPI 在运行(Server Application Programming Interface: the API used by PHP to interface with Web Servers)。

1、模块初始化阶段(module init)

这个阶段一般是在 SAPI 启动时执行一次,对于 FPM 而言,就是在 fpm 的 master 进行启动时执行的。

这个阶段主要进行 PHP 框架、zend 引擎的初始化操作。,PHP 把自己所有已加载扩展的MINIT方法(全称Module Initialization,每个模块自己定义的函数) 都执行一遍。 在这个时间里,扩展可以定义一些自己的常量、类、资源等所有会被用户端的PHP脚本用到的东西。

2、请求初始化阶段(request init)

发生时机:当一个页面请求发生时,在请求处理前都会经历的一个阶段。

PHP 会迅速开辟一个新的环境,并重新扫描自己的各个扩展, 遍历执行它们各自的 RINIT 方法(俗称Request Initialization), 这时候一个扩展可能会初始化在本次请求中会使用到的变量等, 还会初始化等会儿用户端中的变量等数据。

3、php脚本执行阶段

PHP 代码解析执行的过程。Zend 引擎接管控制权,将 PHP 脚本代码编译成 opcodes 并顺次执行

4、请求结束阶段(request shutdown)

请求处理完后就进入了结束阶段,PHP就会启动清理程序。

将 flush 输出内容、发送 http 响应内容等,然后它会按顺序调用各个模块的 RSHUTDOWN 方法。 RSHUTDOWN 用以清除程序运行时产生的符号表,也就是对每个变量调用 unset 函数。

5、模块关闭阶段(module shutdown)

该阶段在 SAPI 关闭时执行,与模块初始化阶段对应,这个阶段主要是进行资源的清理、PHP 各模块的关闭操作。

回调各扩展的module shutdown钩子函数。这是发生在所有请求都已经结束之后,例如关闭 fpm 的操作。(这个是对于 CGI 和 CLI 等 SAPI,没有“下一个请求”,所以 SAPI 立刻开始关闭)

 

参考

PHP 的启动与终止

 

posted @ 2020-06-04 22:56  _春华秋实  阅读(317)  评论(0)    收藏  举报