PHP的整个生命周期被划分为以下几个阶段:模块初始化阶段(module startup)、请求初始化阶段(request startup)、执行脚本阶段(executescript)、请求关闭阶段(request shutdown)、模块关闭阶段(module shutdown)。根据不同SAPI的实现,各阶段的执行情况会有一些差异,比如命令行模式下,每次执行一个脚本都会完整地经历这些阶段,而FastCgi模式下则在启动时执行一次模块初始化,然后各个请求只经历请求初始化、执行请求脚本、请求关闭几个阶段,在SAPI关闭时经历模块关闭阶段。
-
模块初始化阶段
- 激活SAPI
- 启动PHP输出
- 初始化垃圾回收器
-
启动Zend引擎
- 启动内存池
- 设置一些util函数句柄
- 设置Zend虚拟机编译、执行器的函数句柄
- 分配函数符号表、类符号表、常量符号表
- 注册Zend核心扩展
- 注册Zend定义的标准常量
- 注册$GLOBALS超全局变量的获取handler
- 分配php.ini配置的存储符号表
- 注册PHP定义的常量
- 解析php.ini
- 映射PHP、Zend核心的php.ini配置
- 注册用于获取
$_GET
、$_POST
、$_COOKIE
、$_SERVER
、$_ENV
、$_REQUEST
、$_FILES
变量的 handler - 注册静态编译的扩展
- 注册动态加载的扩展
- 回调各扩展定义的module starup钩子函数
- 注册php.ini中禁用的函数、类
-
请求初始化阶段
- 激活输出
-
激活Zend引擎
- 重置垃圾回收器
- 初始化编译器
- 初始化执行器
- 初始化词法扫描器
- 激活SAPI
- 回调各扩展定义的request startup钩子函数
-
执行脚本阶段
-
编译阶段
- PHP 源代码
- 抽象语法树
- opline指令
- 执行阶段
-
-
请求关闭阶段
- flush输出内容
- 发送HTTP应答header头
- 清理全局变量
- 关闭编译器
- 关闭执行器
-
模块关闭阶段
- 进行资源的清理
- PHP各模块的关闭操作
- 回调各扩展的module shutdown钩子函数