跟厂长学PHP7内核(五):系统分析生命周期 (4)

初始化针对不同内容类型的处理函数

//main/php_content_types.c int php_startup_sapi_content_types(void) { sapi_register_default_post_reader(php_default_post_reader); sapi_register_treat_data(php_default_treat_data); sapi_register_input_filter(php_default_input_filter, NULL); return SUCCESS; } 二、请求初始化阶段 函数 说明
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钩子函数  
2.1、php_output_activate

重新为output_globals分配内存,初始化与输出处理程序相关的堆栈,并将OG宏的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.2、zend_activate

zend引擎的初始化,主要作用为重置垃圾回收、初始化编译器、初始化执行器、初始化扫描器。

函数 说明
gc_reset()   重置垃圾回收  
init_compiler()   初始化编译器  
init_executor()   初始化执行器  
startup_scanner()   初始化扫描器  
2.3、sapi_activate

对SG宏内的一些变量进行初始化,并调用当前sapi_module_struct中定义的钩子函数activate()以及input_filter_init(),但是在cli模式下,这两个钩子函数都没有实现,返回了null。

//main/SAPI.c SAPI_API void sapi_activate(void) { zend_llist_init(&SG(sapi_headers).headers, sizeof(sapi_header_struct), (void (*)(void *)) sapi_free_header, 0); SG(sapi_headers).send_default_content_type = 1; /* SG(sapi_headers).http_response_code = 200; */ SG(sapi_headers).http_status_line = NULL; SG(sapi_headers).mimetype = NULL; SG(headers_sent) = 0; ZVAL_UNDEF(&SG(callback_func)); SG(read_post_bytes) = 0; SG(request_info).request_body = NULL; ...... } 2.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; } 2.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++; } } 三、执行脚本阶段 函数 说明
compile_file()   -  
open_file_for_scanning()   读取PHP代码内容  
zend_parse()   词法语法分析生成AST  
init_op_array()   初始化op_array  
zend_compile_top_stmt()   将AST转换为op_array  
pass_two()   设置op_array中对应zend虚拟机的handler  
zend_execute()   执行op_array  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxyjx.html