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

php_core_globals顾名思义,就是php核心的全局变量,定义很多PHP相关的参数,比如内存上限、是否显示错误信息、上传文件大小限制、输入输出编码、禁用的函数等等,这里不再赘述,感兴趣的同学可以去看一下源码。

//main/php_globals.h struct _php_core_globals { zend_bool implicit_flush; zend_long output_buffering; zend_bool sql_safe_mode; zend_bool enable_dl; ...... };

而php_startup_ticks函数就是对PG宏的成员变量tick_functions进行初始化。

1.5、gc_globals_ctor函数 ZEND_API void gc_globals_ctor(void) { gc_globals_ctor_ex(&gc_globals); }

这里又出现了一个gc_globals,它是与垃圾回收相关的结构体,这段代码是对gc_globals进行初始化。

//Zend/zend_gc.c typedef struct _zend_gc_globals { zend_bool gc_enabled; zend_bool gc_active; zend_bool gc_full; gc_root_buffer *buf; /* preallocated arrays of buffers */ ...... } zend_gc_globals; 1.6、zend_startup函数

++start_memory_manager++:初始化内存管理器,对结构体alloc_globals进行初始化。

++virtual_cwd_startup++:virtual_cwd_startup初始化了cwd_globals,根据源码可以看出成员变量都与realpath_cache有关,realpath_cache是什么呢?我们平时在写代码的时候,经常会使用include、include_once、require、require_once等语句导入文件,如果每次使用这些语句都要去对应的目录中寻找目标文件,势必会降低性能,所以官方加入了缓存,以便PHP再次使用时不必到include_path中查找,加快PHP的执行速度。

//Zend/zend_virtual_cwd.c typedef struct _virtual_cwd_globals { cwd_state cwd; zend_long realpath_cache_size; zend_long realpath_cache_size_limit; zend_long realpath_cache_ttl; realpath_cache_bucket *realpath_cache[1024]; } virtual_cwd_globals;

++zend_startup_extensions_mechanism++。启动扩展机制,初始化zend_extensions结构体。

int zend_startup_extensions_mechanism() { /* Startup extensions mechanism */ zend_llist_init(&zend_extensions, sizeof(zend_extension), (void (*)(void *)) zend_extension_dtor, 1); last_resource_number = 0; return SUCCESS; }

++提供编译与执行入口++

zend_compile_file = compile_file; zend_execute_ex = execute_ex;

++zend_init_opcodes_handlers++。初始化Zend虚拟机的handler

++初始化CG、EG++。初始化CG(function_table)、CG(class_table)、CG(auto_globals)、EG(zend_constants)。

GLOBAL_FUNCTION_TABLE = (HashTable *) malloc(sizeof(HashTable)); GLOBAL_CLASS_TABLE = (HashTable *) malloc(sizeof(HashTable)); GLOBAL_AUTO_GLOBALS_TABLE = (HashTable *) malloc(sizeof(HashTable)); GLOBAL_CONSTANTS_TABLE = (HashTable *) malloc(sizeof(HashTable));

++ini_scanner_globals_ctor++。初始化ini_scanner_globals。

++php_scanner_globals_ctor++。初始化language_scanner_globals。

++zend_set_default_compile_time_values++。设置了编译相关的配置。

//Zend/zend.c static void zend_set_default_compile_time_values(void) /* {{{ */ { /* default compile-time values */ CG(short_tags) = short_tags_default; CG(compiler_options) = compiler_options_default; }

++EG(error_reporting)++。EG宏就是executor_globals,Zend执行器相关的全局变量,在这里对我们熟知的error_reporting进行配置。

//Zend/zend_globals.h struct _zend_executor_globals { zval uninitialized_zval; zval error_zval; /* symbol table cache */ zend_array *symtable_cache[SYMTABLE_CACHE_SIZE]; zend_array **symtable_cache_limit; zend_array **symtable_cache_ptr; ...... }

++zend_interned_strings_init++。初始化内部字符串。

//Zend/zend_string.c void zend_interned_strings_init(void) { #ifndef ZTS zend_string *str; zend_hash_init(&CG(interned_strings), 1024, NULL, _str_dtor, 1); ...... }

++zend_startup_builtin_functions++。初始化内部函数。

//Zend/zend_builtin_functions.c int zend_startup_builtin_functions(void) /* {{{ */ { zend_builtin_module.module_number = 0; zend_builtin_module.type = MODULE_PERSISTENT; return (EG(current_module) = zend_register_module_ex(&zend_builtin_module)) == NULL ? FAILURE : SUCCESS; }

++zend_register_standard_constants++。注册常量,比如E_ERROR、E_WARNING、E_NOTICE、E_CORE_ERROR等。

//Zend/zend_constants.c void zend_register_standard_constants(void) { REGISTER_MAIN_LONG_CONSTANT("E_ERROR", E_ERROR, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_RECOVERABLE_ERROR", E_RECOVERABLE_ERROR, CONST_PERSISTENT | CONST_CS); REGISTER_MAIN_LONG_CONSTANT("E_WARNING", E_WARNING, CONST_PERSISTENT | CONST_CS); ...... }

++zend_register_auto_global++。将GLOBALS加入CG(auto_globals)。

//Zend/zend.c zend_register_auto_global(zend_string_init("GLOBALS", sizeof("GLOBALS") - 1, 1), 1, php_auto_globals_create_globals);

++zend_init_rsrc_plist++。初始化持久化符号表。

int zend_init_rsrc_plist(void) { zend_hash_init_ex(&EG(persistent_list), 8, NULL, plist_entry_destructor, 1, 0); return SUCCESS; }

++zend_init_exception_op++。初始化EG(exception_op)。

++zend_init_call_trampoline_op++。初始化EG(call_trampoline_op)。

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

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