Apache HTTP Server 版本 2.4
這是第一次嘗試寫下我在嘗試將 mod_mmap_static
模組轉換至 Apache 2.0 時學到的教訓。這篇文件絕非權威文件,可能在某些方面也不正確,但這是一個開始。
這些常式現在必須是 apr_status_t
型別,並傳回該型別的值。通常,傳回值會是 APR_SUCCESS
,除非有必要在清理時傳送錯誤訊號。請注意,即使您傳送錯誤訊號,仍非所有程式碼都會檢查並處理該錯誤。
這些常式現在應重新命名,更清楚地表示它們在整體處理流程中的位置。因此,名稱從 mmap_init
稍作修改為 mmap_post_config
。傳遞的引數已大幅變更,目前看起來如下
apr_pool_t *p
apr_pool_t *plog
apr_pool_t *ptemp
server_rec *s
許多資料型別已移至 APR。這意味著有些型別已經更改名稱,例如上面顯示的型別。以下是您可能需要進行的一些變更簡介。
pool
變為 apr_pool_t
table
變為 apr_table_t
新的架構使用一系列掛鉤來呼叫您的函式。您必須透過新的函式 static void register_hooks(void)
將這些掛鉤新增至模組。一旦您了解需要執行的內容,函式便相當直接。需要在處理要求的某個階段呼叫的各個函式都需要註冊,但處理常式則不必。有許多階段可以新增函式,而且對每個階段,您可以透過高度控制來指定呼叫函式的相對順序。
以下是新增至 mod_mmap_static
的程式碼
static void register_hooks(void) { static const char * const aszPre[]={ "http_core.c",NULL }; ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE); ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST); };
這會註冊兩個需要呼叫的函式,一個在 post_config
階段(幾乎每個模組都需要這個函式),另一個則是在 translate_name
階段。請注意,雖然有不同的函式名稱,但每個函式的格式都相同。那麼格式是什麼?
ap_hook_階段名稱(函式名稱, 先決函式, 後續函式, 位置);
定義了 3 個掛勾位置...
HOOK_FIRST
HOOK_MIDDLE
HOOK_LAST
若要定義位置,請使用位置,然後透過先決函式及後續函式修改它。每個修改子都可以是函式清單,應該在執行函式之前 (先決函式) 或執行函式之後 (後續函式) 呼叫。
在 mod_mmap_static
的情況下,我並不在乎 post_config
階段,但核心模組在完成名稱轉譯後 必須呼叫 mmap_static_xlat
,因此使用 aszPre 定義位置 HOOK_LAST
的修改子。
現在在建立模組定義時,可擔心的階段已大幅減少。舊的定義如下:
module MODULE_VAR_EXPORT module_name_module = { STANDARD_MODULE_STUFF, /* initializer */ /* dir config creater */ /* dir merger --- default is to override */ /* server config */ /* merge server config */ /* command handlers */ /* handlers */ /* filename translation */ /* check_user_id */ /* check auth */ /* check access */ /* type_checker */ /* fixups */ /* logger */ /* header parser */ /* child_init */ /* child_exit */ /* post read-request */ };
新的結構更加簡單...
module MODULE_VAR_EXPORT module_name_module = { STANDARD20_MODULE_STUFF, /* create per-directory config structures */ /* merge per-directory config structures */ /* create per-server config structures */ /* merge per-server config structures */ /* command handlers */ /* handlers */ /* register hooks */ };
有些可以直接轉移,有些則不行。我將嘗試在以下總計應該執行的作業。
直接轉移的階段
/* dir config creater */
/* 建立每個目錄的組態結構 */
/* 伺服器組態 */
/* 建立每個伺服器的組態結構 */
/* dir merger */
/* 合併每個目錄的組態結構 */
/* 合併伺服器組態 */
/* 合併每個伺服器的組態結構 */
/* 指令表 */
/* 指令 apr_table_t */
/* 處理常式 */
/* 處理常式 */
舊函式的其餘部分應註冊為掛勾。目前定義了以下掛勾階段...
ap_hook_pre_config
ap_hook_check_config
ap_hook_test_config
ap_hook_open_logs
ap_hook_post_config
_init
常式的場所ap_hook_http_method
ap_hook_auth_checker
ap_hook_access_checker
ap_hook_check_user_id
ap_hook_default_port
ap_hook_pre_connection
ap_hook_process_connection
ap_hook_child_init
ap_hook_create_request
ap_hook_fixups
ap_hook_handler
ap_hook_header_parser
post_read_request
來達成此目的ap_hook_insert_filter
ap_hook_log_transaction
ap_hook_optional_fn_retrieve
ap_hook_post_read_request
ap_hook_quick_handler
ap_hook_translate_name
ap_hook_type_checker