php lifecycle 2 - yaokun123/php-wiki GitHub Wiki
请求初始化阶段
函数 | 说明 |
---|---|
php_output_activate() | 重置输出全局变量,初始化输出相关堆栈 |
zend_activate() | 初始化Zend引擎 |
sapi_activate() | 初始化SG宏,调各sapi钩子函数activate |
zend_signal_activate() | 信号处理 |
zend_set_timeout() | 设置超时时间 |
php_hash_environment() | 初始化PHP请求的全局变量 |
zend_activate_modules() | 调用各扩展定义的request_startup钩子函数 |
1、php_output_activate
重新为output_globals分配内存,初始化与输出处理程序相关的堆栈,并将OG宏(output_globals)的flags设置为激活状态。
//main/output.c
PHPAPI int php_output_activate(void)
{
#ifdef ZTS
memset((*((void ***) ZEND_TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(output_globals_id)], 0, sizeof(zend_output_globals));
#else
memset(&output_globals, 0, sizeof(zend_output_globals));
#endif
zend_stack_init(&OG(handlers), sizeof(php_output_handler *));
OG(flags) |= PHP_OUTPUT_ACTIVATED;
return SUCCESS;
}
2、zend_activate
zend引擎的初始化,主要作用为重置垃圾回收、初始化编译器、初始化执行器、初始化扫描器。
函数 | 说明 |
---|---|
gc_reset() | 重置垃圾回收 |
init_compiler() | 初始化编译器 |
init_executor() | 初始化执行器 |
startup_scanner() | 初始化扫描器 |
3、sapi_activate
对SG宏内的一些变量进行初始化,并调用当前sapi_module_struct中定义的钩子函数activate()以及input_filter_init(),但是在cli模式下,这两个钩子函数都没有实现,返回了null。
4、php_hash_environment
为http_globals分配内存,初始化auto_globals,解析请求参数并存放到全局变量中。
PHPAPI int php_hash_environment(void)
{
memset(PG(http_globals), 0, sizeof(PG(http_globals)));
zend_activate_auto_globals();
if (PG(register_argc_argv)) {
php_build_argv(SG(request_info).query_string, &PG(http_globals)[TRACK_VARS_SERVER]);
}
return SUCCESS;
}
5、zend_activate_modules
该函数通过遍历注册在module_registry的所有模块,调用每个模块的钩子函数request_startup()进行初始化。
ZEND_API void zend_activate_modules(void) /* {{{ */
{
zend_module_entry **p = module_request_startup_handlers;
while (*p) {
zend_module_entry *module = *p;
if (module->request_startup_func(module->type, module->module_number)==FAILURE) {
zend_error(E_WARNING, "request_startup() for %s module failed", module->name);
exit(1);
}
p++;
}
}