PHP内核之Apache的PHP模块启动
来源:互联网 发布:windows r 编辑:程序博客网 时间:2024/05/16 23:35
首先,我们必须知道所有的apache module都必须是这个结构体,其定义结构如下(以PHP模块为例):
AP_MODULE_DECLARE_DATA module php5_module = {STANDARD20_MODULE_STUFF,create_php_config,/* create per-directory config structure */merge_php_config,/* merge per-directory config structures */NULL,/* create per-server config structure */NULL,/* merge per-server config structures *//* 上面4项都是定义httpd.conf中命令的作用的 */php_dir_cmds,/* command apr_table_t */ * 定义在httpd.conf中添加的命令,和各命令的处理函数 *//php_ap2_register_hook/* register hooks */ /* hooks,定义什么时候执行我们这个 module的相关函数 */};
STANDARD20_MODULE_STUFF这个宏是必须的,这个宏在经过扩展以后,可以为编译后的模块载入服务器构建提供版本信息,
在PHP的模块中,
create_php_config函数创建目录配置结构,
merge_php_config合并目录配置结构,
php_dir_cmds函数为模块配置相关指令,
php_ap2_register_hook 注册模块的钩子程序,
在这里主要关注的是php_ap2_register_hook.这里定义的一些回调方法,会在Apache启动的时候直接调用。
查看php-5.5.12/sapi/apache2handler/sapi_apache2.c文件:
void php_ap2_register_hook(apr_pool_t *p){ap_hook_pre_config(php_pre_config, NULL, NULL, APR_HOOK_MIDDLE);ap_hook_post_config(php_apache_server_startup, NULL, NULL, APR_HOOK_MIDDLE);ap_hook_handler(php_handler, NULL, NULL, APR_HOOK_MIDDLE);ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE);}
pre_config, post_config, child_init 是启动挂钩,在服务器启动时调用
handler是请求挂钩,在服务器处理请求时调用
其中
在 post_config 挂钩中启动php
post_config通过php_apache_server_startup函数实现,
php_apache_server_startup函数也在同一个文件里面实现:
static intphp_apache_server_startup(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s){void *data = NULL;const char *userdata_key = "apache2hook_post_config";/* Apache will load, unload and then reload a DSO module. This * prevents us from starting PHP until the second load. */apr_pool_userdata_get(&data, userdata_key, s->process->pool);if (data == NULL) {/* We must use set() here and *not* setn(), otherwise the * static string pointed to by userdata_key will be mapped * to a different location when the DSO is reloaded and the * pointers won't match, causing get() to return NULL when * we expected it to return non-NULL. */apr_pool_userdata_set((const void *)1, userdata_key, apr_pool_cleanup_null, s->process->pool);return OK;}/* Set up our overridden path. */if (apache2_php_ini_path_override) {apache2_sapi_module.php_ini_path_override = apache2_php_ini_path_override;}#ifdef ZTStsrm_startup(1, 1, 0, NULL);#endifsapi_startup(&apache2_sapi_module);apache2_sapi_module.startup(&apache2_sapi_module);apr_pool_cleanup_register(pconf, NULL, php_apache_server_shutdown, apr_pool_cleanup_null);php_apache_add_version(pconf);return OK;}
在这个函数里会调用apache2_sapi_module.startup函数,它最终调用的是php_module_startup函数,这个函数会初始化若干全局变量,若干常量,Zend引擎和核心组件,解析php.ini,全局操作函数,静态模块和共享模块(MINIT),同时还会禁用一些函数和类
这个函数具体介绍可以查看前一篇博文 PHP内核之SAPI:Apache2 SAPI分析,
这就完成从apache启动之后,至PHP的初始化和环境准备了。
0 0
- PHP内核之Apache的PHP模块启动
- APache的PHP模块启动
- PHP内核探索:Apache模块介绍
- 8.PHP内核探索:Apache模块介绍
- PHP内核探索:Apache模块介绍
- Apache配置PHP模块
- Apache 配置 php 模块
- Apache加载php模块
- Apache加载php模块
- apache添加php模块
- apache装载php模块
- Apache无法加载PHP模块的问题
- Apache模块的方式安装PHP
- PHP内核两大流程之启动PHP的核心代码段
- 解决Apache/PHP无法启动的问题
- 解决Apache/PHP无法启动的问题
- 解决Apache/PHP无法启动的问题
- 解决Apache/PHP无法启动的问题
- springmvc学习指南-springmvc的CRUD入门
- 数据结构:2-3树与红黑树
- Struts2工作原理
- 面向对象_static的注意事项
- [linux]jenkins迁移
- PHP内核之Apache的PHP模块启动
- 【Codeforces Round #351 Div. 2】 673A Bear and Game
- 哈希 /java初学
- 389. Find the Difference
- 高效使用google及提问
- Fedora 下搭建Lampp开发环境
- C#控制台基础 用do-while循环限制用户只能输入yes或者no
- Java同步容器与并发容器
- 浅析 - Android异步操作