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()