跟厂长学PHP内核(四):生命周期之开始前的躁动 (2)

该函数定义了sapi_globals_struct,也就是我们常说的SG宏,它的主要作用是保存请求的基本信息,比如服务器信息、header、编码等。

//main/SAPI.h typedef struct _sapi_globals_struct { void *server_context; sapi_request_info request_info; sapi_headers_struct sapi_headers; int64_t read_post_bytes; unsigned char post_read; unsigned char headers_sent; zend_stat_t global_stat; char *default_mimetype; char *default_charset; HashTable *rfc1867_uploaded_files; zend_long post_max_size; int options; zend_bool sapi_started; double global_request_time; HashTable known_post_content_types; zval callback_func; zend_fcall_info_cache fci_cache; } sapi_globals_struct; 2.3、sapi_module->startup

我们继续往下看,sapi_module调用了startup函数:

//sapi/cli/php_cli.c if (sapi_module->startup(sapi_module) == FAILURE) { exit_status = 1; goto out; }

然后又调用了CLI在sapi_module_struct中定义的startup对应的钩子函数php_cli_startup:

//sapi/cli/php_cli.c static sapi_module_struct cli_sapi_module = { "cli", /* name */ "Command Line Interface", /* pretty name */ php_cli_startup, /* startup */ ...... }

继续跟进,php_cli_startup函数中又调用了php_module_startup函数:

//sapi/cli/php_cli.c static int php_cli_startup(sapi_module_struct *sapi_module) /* {{{ */ { if (php_module_startup(sapi_module, NULL, 0)==FAILURE) { return FAILURE; } return SUCCESS; } 2.4、php_module_startup

是不是很眼熟,这不就是模块初始化阶段的函数嘛!原来执行了这么久才到我们的关键点,模块初始化阶段内容比较多,我们通过下一章进行详细剖析。

//main/main.c int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint num_additional_modules) { zend_utility_functions zuf; zend_utility_values zuv; int retval = SUCCESS, module_number=0; /* for REGISTER_INI_ENTRIES() */ char *php_os; zend_module_entry *module; ... }

注意:我在本文贴出的代码都标识了文件位置,我们可以看出来,在PHP五大生命周期开始之前一直都是在sapi目录中执行的,而从php_module_struct也就是模块初始化阶段开始,才执行到了main目录,这意味着PHP的生命周期的第一个阶段是从main目录下开始的。

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

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