Apache的PHP模块启动


首先,了解一下每个Apache模块都会输出一个模块数据结构,其定义结构如下(以PHP模块为例):

  1. AP_MODULE_DECLARE_DATA module php5_module = {  
  2.         STANDARD20_MODULE_STUFF,  
  3.         create_php_config,              /* create per-directory config structure */  
  4.         merge_php_config,               /* merge per-directory config structures */  
  5.         NULL,                                   /* create per-server config structure */  
  6.         NULL,                                   /* merge per-server config structures */  
  7.         php_dir_cmds,                   /* command apr_table_t */  
  8.         php_ap2_register_hook   /* register hooks */  
  9. };  

STANDARD20_MODULE_STUFF这个宏是必须的,这个宏在经过扩展以后,可以为编译后的模块载入服务器构建提供版本信息,在PHP的模块中,create_php_config函数创建目录配置结构,,merge_php_config合并目录配置结构,php_dir_cmds函数为模块配置相关指令,php_ap2_register_hook 注册模块的钩子程序,对这个结构体会在apache的模块中专门说明,在这里主要关注的是php_ap2_register_hook.这里定义的一些回调方法,会在Apache启动的时候直接调用。

php_ap2_register_hook函数的实现在源码sapi/apache2handler/sapi_apache2.c文件中:

  1. void php_ap2_register_hook(apr_pool_t *p)  
  2. {  
  3.         ap_hook_pre_config(php_pre_config, NULL, NULL, APR_HOOK_MIDDLE);  
  4.         ap_hook_post_config(php_apache_server_startup, NULL, NULL, APR_HOOK_MIDDLE);  
  5.         ap_hook_handler(php_handler, NULL, NULL, APR_HOOK_MIDDLE);  
  6.         ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE);  
  7. }  

php_apache_server_startup函数也在同一个文件里面实现:

  1. static int  
  2. php_apache_server_startup(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)  
  3. {  
  4.         void *data = NULL;  
  5.         const char *userdata_key = "apache2hook_post_config";  
  6.   
  7.         /* Apache will load, unload and then reload a DSO module. This 
  8.          * prevents us from starting PHP until the second load. */  
  9.         apr_pool_userdata_get(&data, userdata_key, s->process->pool);  
  10.         if (data == NULL) {  
  11.                 /* We must use set() here and *not* setn(), otherwise the 
  12.                  * static string pointed to by userdata_key will be mapped 
  13.                  * to a different location when the DSO is reloaded and the 
  14.                  * pointers won't match, causing get() to return NULL when 
  15.                  * we expected it to return non-NULL. */  
  16.                 apr_pool_userdata_set((const void *)1, userdata_key, apr_pool_cleanup_null, s->process->pool);  
  17.                 return OK;  
  18.         }  
  19.   
  20.         /* Set up our overridden path. */  
  21.         if (apache2_php_ini_path_override) {  
  22.                 apache2_sapi_module.php_ini_path_override = apache2_php_ini_path_override;  
  23.         }  
  24. #ifdef ZTS   
  25.         tsrm_startup(1, 1, 0, NULL);  
  26. #endif   
  27.         sapi_startup(&apache2_sapi_module);  
  28.         apache2_sapi_module.startup(&apache2_sapi_module);  
  29.         apr_pool_cleanup_register(pconf, NULL, php_apache_server_shutdown, apr_pool_cleanup_null);  
  30.         php_apache_add_version(pconf);  
  31.   
  32.         return OK;  
  33. }  
  • 1
  • 2
  • 下一页

相关内容