PHP生命周期
概述
PHP的整个生命周期被划分为以下几个阶段:模块初始化阶段、请求初始化阶段、执行脚本阶段、请求关闭阶段、模块关闭阶段。php的cli模式下每次执行一个脚本都会完整的经历这些阶段,而FastCgi模式下则只会在启动时执行一次模块初始化阶段,然后接下来的各个请求只会执行请求初始化阶段、脚本执行阶段,请求关闭阶段。
流程图
1.模块初始化阶段
这个阶段主要进行PHP框架、zend引擎的初始化操作。这个阶段一般只在SAPI启动时执行一次,对于Fpm而言,就是在Fpm的master进程启动时执行。
- **SAPI:sapi_active(),初始化请求信息SG(request info)、设置读取POST请求的 handler等,在module startup阶段处理完后将调用sapi_deactivate()。
- 启动PHP输出:php_output_startup()
- 初始化垃圾回收器:gc_globals_ctor(),分配zend_gc_globals内存
- 启动Zend引擎:zend_startup()
- 注册PHP定义的常量:PHP_VERSION、PHP_ZTS、PHP_SAPI,等等
- 解析php.ini:解析完成后所有的php.ini配置保存在configuration_hash哈希表中
映射PHP、Zend核心的php.ini配置:根据解析出php.ini,获取对应的配置值,将最终的配置插入EG(ini_directives)哈希表。 - 注册用于获取
$_GET
、$_POST
、$_COOKIE
、$_SERVER
、$_ENV
、$_REQUEST
、$_FILES
变量的handler - 注册静态编译的扩展:php_regesiter_internal_extensions_func()。
- 注册动态加载的扩展:php_ini_register_extensions(),将php.ini中配置的扩展加载到php中
- 回调各扩展定义的module startup钩子函数,即通过PHP_MINT_FUNCTION()定义的函数
- 注册php.ini中禁用的函数、类:disable_functions、disable_classes。
2.请求初始化阶段
该阶段是在请求处理前每个请求都会经历的一个阶段,对于Fpm而言,是在worker进程accept一个请求且读取、解析完请求数据后的一个阶段。该阶段的处理函数为php_request_startup
- **输出:php_output_activate()
- **Zend引擎:zend_activate(),主要操作如下:
- 1.重置垃圾回收器:gc_reset()
- 2.初始化编译器:init_compiler
- 3.初始化执行器:init_executor
- 4.初始化词法扫描器:startup_scanner()
- **SAPI:sapi_activate()
回调个扩展定义的request startup钩子函数:zend_activate_modules()
3.执行脚本阶段
该阶段包括PHP代码的编译、执行两个核心阶段,这也是Zend引擎最重要的功能。在编译阶段,PHP脚本将经历从PHP源代码到抽象语法树再到opline指令的转化过程,最终生成的opline指令就是Zend引擎可识别的执行指令,这些指令被执行器执行,这就是PHP代码解释执行的过程。
4.请求关闭阶段
在PHP脚本解释执行完成后将进入请求关闭阶段,这个阶段将flush输出内容、发送HTTP应答header头、清理全局变量、关闭编译器、关闭执行器等。另外,在该阶段将回调各个扩展的request shutdown钩子函数。
5.模块关闭阶段
该阶段在SAPI关闭时执行,与模块初始化阶段对应,这个阶段主要进行资源的清理、PHP各个模块的关闭操作,同时,将回调各个扩展的module shutdown 钩子函数。具体的处理函数为php_module_shutdown()。