PHP
的整个生命周期可以大致分为五个步骤:
STEP1
:模块初始化阶段(module init
->php_module_startup
)STEP2
:请求初始化阶段(request init
->php_request_startup
)STEP3
:脚本执行阶段(execute script
->php_execute_script
)STEP4
:请求关闭阶段(request shutdown
->php_request_shutdown
)STEP5
:模块关闭阶段(module shutdown
->php_module_shutdown
)
其中
STEP1
和STEP5
不是每种模式下都要重复执行的。在cli
模式下,脚本执行会完整经历5
个步骤。而在Fast-CGI
模式下,STEP1
只在启动时执行,每个请求处理时只经历STEP2
、STEP3
、STEP4
,在最终SAPI
关闭时会经历STEP5
。
STEP1
:模块初始化阶段(MINIT
)。这个阶段主要是模块的初始化,具体包括PHP
框架,Zend
引擎的初始化。
- 调用
sapi_activate()
,设置一堆SG(xxx)
,对sapi_globals
中的成员变量做初始化。在php_module_startup()
的结尾处会调用sapi_deactivate()
(话说,没搞明白为啥要调用这个。。)- 调用
php_output_startup()
,启动PHP
的输出php_startup_ticks()
,对tick_functions
进行初始化- 针对是否
ZTS
进行core_globals
的相应设定- 调用
gc_globals_ctor()
,初始化垃圾回收器,设定gc_globals
- 设定
zuf
,并调用zend_startup(&zuf, NULL)
来启动Zend
引擎,主要包括:
- 针对是否
ZTS
设定一些全局参数zend_cpu_startup()
,具体做啥的。。没看明白start_memory_manager()
,初始化内存管理器- 设置一些
util
函数句柄:utility_functions->xxx
- 设置
Zend
虚拟机的编译器和执行器:zend_compile_file
、zend_execute_ex
、zend_execute_internal
,设置垃圾回收器:gc_collect_cycles
zend_vm_init()
,初始化Zend
虚拟机- 分配:
GLOBAL_FUNCTION_TABLE(CG(function_table))
、GLOBAL_CLASS_TABLE(CG(class_table))
、GLOBAL_AUTO_GLOBALS_TABLE
(未知)和