php sapi生命周期
php
api
扩展
执行
编程技术
发布日期
2023-06-02
更新日期
2023-06-03
阅读次数 100
文章字数 3.1k
sapi全程为Server Abstraction API,即抽象服务应用编程接口。
应用服务,常见的有php-cli以及php-fpm,前者为命令行服务,后者是web服务
从sapi层面来看,生命周期经历5个阶段
main()->php_module_startup()->php_request_startup()->php_excute_script()->php_request_shutdown()->php_module_shutdown()
在fpm模式下因为是常驻服务,request_startup()->excute_script()->request_shutdown()通常会多次执行
可以在php扩展【php-module】里测试生命周期,分别对应PHP_MINIT【M就是module缩写,init表示start】,PHP_RINIT【request_start】,PHP_RSHUTDOWN【request_shutdown】,PHP_MSHUTDOWN【module_shutdown】
php module_start()
php模块初始化阶段
- sapi_active():主要是初始化sapi全局变量,尤其是sapi_headers和request_info
- php_output_startup():主要是初始化output全局变量以及output handler相关的冲突表
- php_start_ticks():初始化定时器
- gc_globals_ctor():初始化gc垃圾回收器,即初始化gc全局变量
- zend_startup():
- 启动zend引擎:启动zend内存管理器;设置编译器句柄、执行器句柄以及opcodes句柄;
- 初始化全局函数表、全局类表、全局常量表、以及超全局常量表;
- 注册底层内置的扩展即Code扩展(zend_builtin_module)以及隶属该扩展的functions;
- 注册zend相关的标准常量,初始化php.ini配置符号等
- REGIST_XXX_CONSTANT():注册php相关的标准常量
- php_init_config()
- 解析php.ini配置并报存到configuration_hash表中
- 初始化extension_lists.engine和extension_lists.functions
- REGIST_INI_ENTRIES():将configuration_hash表中的Core配置辐射到对应的Core全局变量
- zend_register_standard_ini_entries():将configuration_hash表中的standard配置辐射到对应的standard扩展当中,即注入到该扩展对应的全局空间
- php_startup_auto_globals():注册超全局变量
- php_register_internal_extensions():注册底层内置的扩展以及隶属该扩展的函数
- php_ini_register_extensions():注册用户自定义的扩展以及隶属该扩展的函数
- zend_start_modules():执行各个php扩展的HOOK:module->module_startup_func()
- zend_startup_extensions():执行各个zend扩展的HOOK:extension->startup()
- zend_collect_module_handlers():主要是收集各个扩展的request
- php_disable_functions/classes():主要是禁用php.ini所设定的函数和类
- sapi_deactivate():对应于sapi_active(),主要是重置SG的sapi_headers,request_info
php_request_start()
php请求阶段初始化
- php_output_activate():激活php输出
- zend_activate():激活zend引擎,主要包括:
- 重置垃圾回收器;初始化编译器;初始化执行器;初始化词法和语法分析器
- 初始化全局变量符号表;初始化included文件符号表
- 执行zend引擎扩展的HOOK:extension->activate()
- sapi_activate():...
- php_hash_environment():主要是“惰性”初始化超全局变量
- zend_activate_modules():执行各个php扩展的HOOK:module->request_startup_func()
php_excute_script()
php脚本执行阶段【严格来说是解析+编译+执行】
php代码-->RE2C->Token->YACC
->AST抽象语法树->Zend编译器
->Opcodes->Zend执行器->Output
php_request_shutdown()
PHP请求关闭阶段
- php_call_shutdown_functions():依次执行register_shutdown_function()注册的HOOK函数
- zend_call_destructors():执行所有的_destruct函数,伴有清理全局变量符号表
- php_output_discard_all()/php_output_end_all():刷新所有的php输出缓冲
- zend_unset_timeout():重置php的最大执行时间max_execution_time
- zend_deactive_modules():执行各个php扩展的HOOK:module->request_shutdown_func()
- php_output_deactivate():关闭php输出,发送HTTP响应头,清理输出句柄
- php_free_shutdown_functions():依次释放通过register_shutdown_function()注册的HOOK函数
- zval_ptr_dtoc(&PG(http_globals)[i]):释放超全局变量PG(http_globals)
- php_free_request_globals():释放last_error以及sys_temp_dir成员所占的内存
- zend_deactivate():
- 关闭词法和语法分析器;关闭编译器;关闭执行器;恢复ini_entries
- 执行各个zend扩展的HOOK:extension->deactivate()
- zend_post_deactive_modules():执行所有扩展的HOOK:xxx->post_shutdown_func()
- sapi_deactivate():对应于sapi_activate(),主要是重置SG的sapi_headers和request_info
- virtual_cwd_deactive():释放虚拟工作目录所占用的内存
- php_shutdown_stream_hashes():关闭流包装类和流过滤器
- shutdown_memory_manager():关闭内存管理器
- zend_unset_timeout():重置php的最大执行时间max_execution_time
php_module_shutdown()
模块关闭阶段
- sapi_flush():分别调用执行各个sapi模块对应的flush()句柄
- zend_destroy_rsrc_list(&EG(persistent_list)):清理持久化的符号表
- zend_destroy_modules():执行各个php扩展的HOOK:module->module_shutdown_func()
- zend_shutdown_extensions():执行各个zend扩展的HOOK:extension->shutdown(_func()
- shutdown_memory_manager():关闭内存管理器
- php_output_shutdown():关闭php输出
- core_globals_dtoc():释放php核心全局变量
文章作者: 朱丰华
文章链接: https://smart.52dixiaowo.com/blog/post-415.html
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。
php
api
扩展
执行
发表评论
相关推荐