Apache中大量使用了Hook机制,使得第三方开发Module可以扩展Apache服务器的默认处理。
Apache Hook功能可以简述如下:
1. 程序主框架根据名称声明和定义Hook
2. 第三方 Module 通过实现和挂载Hook来扩展主框架的行为。
3. 程序主框架在某些操作发生时显示触发Hook
例如, Apache的事务日志(也即访问日志)就是用Hook机制实现的,对应上面的3个环节如下:
1. 在 Apache核心代码 protocol.c中定义了名为log_transaction的Hook:
APR_HOOK_STRUCT(
…
APR_HOOK_LINK(log_transaction)
…
)
…
AP_IMPLEMENT_HOOK_RUN_ALL(int,log_transaction,
(request_rec *r), (r), OK, DECLINED)
2. 可选模块 mod_log_config通过挂载Hook来扩展主程序的行为:
static void register_hooks(apr_pool_t *p)
{
…
ap_hook_log_transaction(multi_log_transaction,NULL,
NULL,APR_HOOK_MIDDLE);
…
}
3. 在 Apache的核心流程 ap_process_request函数中显式触发了该Hook:
void ap_process_request(request_rec *r)
{
…
ap_run_log_transaction(r)
…
}
上述机制是如何实现的呢,在此先做一个简单的描述:
1. 首先,Hook的基础实现是在apr库中,由 apr_hooks.h和
Apache Hook功能可以简述如下:
1. 程序主框架根据名称声明和定义Hook
2. 第三方 Module 通过实现和挂载Hook来扩展主框架的行为。
3. 程序主框架在某些操作发生时显示触发Hook
例如, Apache的事务日志(也即访问日志)就是用Hook机制实现的,对应上面的3个环节如下:
1. 在 Apache核心代码 protocol.c中定义了名为log_transaction的Hook:
APR_HOOK_STRUCT(
…
APR_HOOK_LINK(log_transaction)
…
)
…
AP_IMPLEMENT_HOOK_RUN_ALL(int,log_transaction,
(request_rec *r), (r), OK, DECLINED)
2. 可选模块 mod_log_config通过挂载Hook来扩展主程序的行为:
static void register_hooks(apr_pool_t *p)
{
…
ap_hook_log_transaction(multi_log_transaction,NULL,
NULL,APR_HOOK_MIDDLE);
…
}
3. 在 Apache的核心流程 ap_process_request函数中显式触发了该Hook:
void ap_process_request(request_rec *r)
{
…
ap_run_log_transaction(r)
…
}
上述机制是如何实现的呢,在此先做一个简单的描述:
1. 首先,Hook的基础实现是在apr库中,由 apr_hooks.h和