Go PHP execution flow, PHP extension loading process, PHP load
Original: http://www.imsiren.com/archives/535
In order to be able to develop PHP extensions later. Be sure to understand the order in which PHP is executed. This article is to pave the way for C to develop PHP extensions.
The Web environment we assume as Apache.
When compiling PHP, in order to enable Apache to support PHP, we will generate a mod_php5.so module. Apache loads this module:
When a URL accesses a. php file, it is transferred to the Mod_php5.so module for processing. What is this thing? That's what we always say, SAPI.
The English name is: Server abstraction API.
SAPI said in fact is a collectively, under which there are isapi,cli SAPI, CGI and so on.
With it, you can easily interact with other things, such as apache,iis,cgi.
Okay, back to the chase.
Apache will register the mod_pho5.so module's hook handler when it starts. Apache is not the protagonist today, so don't dwell on it.
When Apache detects that the URL being accessed is a PHP file, control is given to SAPI.
Such as:
After entering the SAPI, the Php_init_handler function of the sapi/apache/mod_php5.c file is executed first
1234567891011121314151617181920 |
static void php_init_handler(server_rec *s, pool *p)
{
register_cleanup(p, NULL, (
void (*)(
void *))apache_php_module_shutdown_wrapper, (
void (*)(
void *))php_module_shutdown_for_exec);
if (!apache_php_initialized) {
apache_php_initialized = 1;
#ifdef ZTS
tsrm_startup(1, 1, 0, NULL);
#endif
sapi_startup(&apache_sapi_module);
php_apache_startup(&apache_sapi_module);
}
#if MODULE_MAGIC_NUMBER >= 19980527
{
TSRMLS_FETCH();
if (PG(expose_php)) {
ap_add_version_component(
"PHP/" PHP_VERSION);
}
}
#endif
}
|
This function mainly calls two functions
Sapi_startup (&apache_sapi_module);
Php_apache_startup (&apache_sapi_module);
123456789101112131415 |
sapi_api void sapi_startup (sapi_module_struct *sf) { sf->ini_entries = NULL; sapi_module = *SF; sapi_globals_ctor (&sapi_globals); virtual_cwd_startup (); /* Could use shutdown to free the main CWD but it would just slow it down for CGI */ reentrancy_startup (); } |
Sapi_startup Create a sapi_globals_struct struct.
Sapi_globals_struct holds basic information about Apache requests, such as server information, headers, encodings, and so on.
123456 |
static void sapi_globals_ctor(sapi_globals_struct *sapi_globals TSRMLS_DC) { memset (sapi_globals, 0, sizeof (*sapi_globals)); zend_hash_init_ex(&sapi_globals->known_post_content_types, 5, NULL, NULL, 1, 0); php_setup_sapi_content_types(TSRMLS_C); } |
Known_post_content_types is a hashtable that initializes its size to 5. Literally I guess it's supposed to be the content type that the client passes over. The
Php_setup_sapi_content_types function adds sapi_post_entry to the Sapi_globals
Sapi_startup execution completes Php_apache_startup
12345678 |
static int php_apache_startup (sapi_module_struct *sapi_module) { if (Php_module_startup (Sapi_module, &apache_module_entry, 1) = = FAILURE) { return failure; } else Code class= "CPP Plain" >{ return success; } } |
Php_module_startup Too many content: is to introduce the role.
1. Initialize the zend_utility_functions structure. This structure is a function pointer that sets Zend, such as error handling functions, output functions, stream manipulation functions, and so on.
2. Set environment variables.
3. Load the php.ini configuration.
4. Load PHP built-in extensions.
5. Write the log.
6. Register the PHP internal set of functions.
7. Call Php_ini_register_extensions, load all external extensions
8. Open all Extensions
9. Some cleanup operations.
The point is, 3,4,7,8
loads the php.ini configuration
if (php_init_config (tsrmls_c) = = FAILURE) {
return FAILURE;
} The
Php_init_config function checks all the php.ini configurations here, and finds all the loaded modules and adds them to the php_extension_lists structure. The
load PHP built-in extension
calls Zend_register_standard_ini_entries to load all of the PHP's built-in extensions, such as Array,mysql.
call php_ini_register_extensions, load all external extensions
Main/php_ini.c
12345678 |
void php_ini_register_extensions(TSRMLS_D) { zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC); zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC); zend_llist_destroy(&extension_lists.engine); zend_llist_destroy(&extension_lists.functions); } |
zend_llist_apply function Traversal extension_lists execution will drop function PHP_LOAD_PHP_EXTENSION_CB
Php_load_php_extension_cb
1234 |
static void php_load_zend_extension_cb( void *arg TSRMLS_DC) { zend_load_extension(*(( char **) arg)); } |
Call EXT/STANDARD/DL.C zend_load_extension to load the extension,
The function skips:
The function finally calls the
if ((Module_entry = ZEND_REGISTER_MODULE_EX (module_entry tsrmls_cc)) = = NULL) {
Dl_unload (handle);
return FAILURE;
}
Put extended information into the hash table Module_registry
Zend/zend_api.c
12345 |
if (Zend_hash_add (&module_registry, Lcname, Name_len +1, ( void *) module, sizeof void **) &module_ptr) { ==failure zend_error (e_core_warning, Code class= "CPP Plain", module->name); efree (lcname); return null; } |
At last
Zend_startup_modules (Tsrmls_c); Sort the modules and detect if they are registered to the Module_registry hash table
Zend_startup_extensions (); Execute extension->startup (extension); Start extension ...
http://www.bkjia.com/PHPjc/1125080.html www.bkjia.com true http://www.bkjia.com/PHPjc/1125080.html techarticle []php execution flow, PHP extension loading process, PHP load Source: http://www.imsiren.com/archives/535 in order to be able to develop PHP extensions later. Be sure to understand the order in which PHP is executed. The article ...