1.模块初始化阶段(module startup)
这个阶段主要进行php框架、zend引擎的初始化操作。该阶段的入口函数为php_module_startup(),这个阶段一般是在SAPI启动时执行一次,对于FPM而言,就是在fpm的master进行启动时执行的。
该阶段的几个主要处理如下所诉:
1.激活SAPI:sapi_activate(),初始化请求信息SG(request_info)、设置读取POST请求的handel等,在module_startup阶段处理完成后将调用sapi_activate()
2.启动php输出 php_output_startup
3.初始化垃圾回收期:gc_globals_ctor(),分配zend_gc_globals内存
4.启动Zedn引擎 zend_startup,主要操作包括:
a.启动内存池 start_memory_manager()
b.设置一些util函数句柄(如zend_error_cb.zend_printf.zend_write)
c.设置Zend虚拟机编译、执行器的函数句柄zend_compile_file,zend_execute_ex,以及垃圾回收的函数句柄gc_collect_cycles
d.分配函数符号表(CG(function_table))、类符号表(CG(class_table))、常量符号表(EG(zend_constants))等,如果是多线程的话,还会分配编译器、执行器的全局变量
e.注册zend核心扩展:zend_startup_builtin_functions(),这个扩展是内核提供的,该过程将注册zend核心扩展提供的函数,比如strlen.define.func_get_args.class_exists等
f.注册zend定义的标准常量:zend_register_standard_constants(),比如E_ERROR.E_WARNING.E_ALL.TRUE.FALSE等
g.注册$GLOBALS超全局变量的获取handler
h.分配php.ini配置的存储符号表 EG(ini_directives)
5.注册php定义的常量,PHP_VERSION.PHP_ZTS.PHP_SAPI等
6.解析php.ini,解析完成后所有的php.ini配置保存在configuration_hash哈希表中。
7.映射php、zend核心的php.ini配置:根据解析出的php.ini,获取对应的配置值,将最终的配置插入EG(ini_directives) 哈希表
8.注册用户获取$_GET.$_POST.$_COOKIE.$_SERVER.$_ENV.$_REQUEST.$_FILES变量的handler
9.注册静态编译的扩展:php_register_internal_extensions_func()
10.注册动态加载的扩展:php_ini_register_extensions(),将php.ini中配置的扩展加载到php中
11.回调各扩展定义的module startup钩子函数,即通过PHP_MINT_FUNCTION()定义的函数
12.注册php.ini中禁用的函数、类,disable_functions.disbale_classes.
2.请求初始化阶段(request startup)
该阶段是在请求处理前每一个请求都会经历的一个阶段,对于fpm而言,是在worker进程accept一个请求并读取、解析完请求数据后的一个阶段。该阶段的处理函数为php_request_startup()
主要的处理有以下几个:
1.激活输出:php_output_activate()
2.激活zend引擎 zend_activate,主要操作如下所述
a.重置垃圾回收器 gc_reset()
b.初始化编译器:init_compiler()
c.初始化执行器:init_executor,将EG(function_table)、EG(clas_table)分配指向CG(function_table)、CG(class_table),所以在php的编译、执行同期,EG(function_table)与CG(function_table)、EG(clas_table)与CG(class_table)是同一个值;另外还会初始化全局变量符号表EG(symbol_table)、include过的文件符号表EG(included_files);
d.初始化词法扫描器:startup_scanner()
f.激活SAPI:sapi_activate()
g.回调各扩展定义的request startup钩子函数 zend_activate_modules()
3.执行脚本阶段(execute script)
该极端包括php代码的编译、执行两个核心阶段,这也是zend引擎最重要的功能。在编译阶段,php脚本将经历从php源代码抽象语法树再到opline指令的转化过程,最终生成的opline指令就是zend引擎可识别的执行指令,这些指令接着被执行器执行,这就是php代码解释执行的过程。这个接口的入口函数为php_execute_script()
4.请求关闭阶段(request shutdown)
在php脚本执行解释器执行完成后将进入请求关闭阶段,这个阶段将flush输出内容、发送http应答header头、清理全局变量、关闭编译器、关闭执行器等。另外,在该阶段将回调各扩展的request shutdown钩子函数。该阶段是请求初始化阶段的相反操作,与请求初始化时的处理一一对应
5.模块关闭阶段(module shutdown)
该阶段在SAPI关闭时执行,与模块初始化阶段对应,这个阶段主要是进行资源的清理、php各模块的关闭操作,同时,将回调各扩展的module shutdown钩子函数。具体的处理函数为 php_module_shutdown()
已有 0 条评论