標籤:
通過上節的例子,我們發現Apache外掛程式開發的一個門檻便是學習它自成體系的一套API。雖然Apache的官網上有對這些API的詳細介紹,但是空拿著一些零散的說明書,是很難快速建立起一套可以啟動並執行系統。(轉載請指明出於breaksoftware的csdn部落格)
為了實現最基礎的URL解析等功能,我把《Apache模組開發指南》一書粗略了翻看了兩遍,以利於迅速瞭解Apache模組編程的相關知識。至於書中具體的知識點,我並不在此贅述。但是為了便於大家瞭解之後遇到的各種相關的知識點,我大致羅列幾條(摘自《Apache模組開發指南》一書):
- ap_標頭檔一般定義了較低層次的API元素,通常(儘管不是總是)被其他標頭檔包含,而被間接訪問。
- http_標頭檔定義了應用開發人員比較感興趣的絕大部分關鍵的API。這些API也可以通過一些模組暴露給指令碼語言。
- util_標頭檔定義了比ap_更高層次的API,但是這些API很少被應用模組直接調用,不過這個規則對兩個檔案例外:util_script.h和util_filter.h。其中util_filter.h定義了過濾API。之後我們會講過濾器時,就會用到它。
- mod_標頭檔定義了被可選模組實現的API。使用這些API可能會引發依賴。在之後的章節中我們將會使用到DBD架構匯出在mod_dbd.h檔案中的API。
- apr_標頭檔定義了APR(Apache Portable Runtime)的API。對於Web伺服器來說,APR庫是外部庫,也是基本庫,並對任何重要的模組來說都是(直接或者間接)必需的。這系列頭非常重要。
其中http_標頭檔又有如下重要的標頭檔:
- http_config.h:定義了配置API,包括配置資料結構、配置向量、任何相關的訪問器。它也定義了它自身的模組資料結構、相關的訪問器和處理函數鉤子。絕大部分模組都需要這個標頭檔。
- http_core.h:定義了各種各樣被Apache核心引出的API,比如request_rec對象提供的訪問器函數。
- http_log.h:定義了錯誤記錄檔API和管道日誌。模組需要這個標頭檔中的錯誤報表函數和相關的宏。
- http_protocol.h:包括了一些高層的函數API,用來執行一些重要的操作,包括所有的對用戶端的正常I/O,以及處理HTTP協議相關方面,如產生正確的應答前序等。它也匯出了一些不在http_request範圍內、必需的處理鉤子。
我們在前一文《伺服器架設筆記——編譯Apache及其外掛程式》中我們提到APR庫,其全稱是Apache Portable Runtime,即Apache可移植執行階段程式庫。還有個叫APR-UTIL庫,顧名思義,其應該是基於APR庫的封裝,提供了一套便於使用APR庫的方法。我們之後的編程中,將會經常使用到這些庫。限於篇幅,我並不打算在此細細講解這些庫。我也只是羅列下《Apache模組開發指南》中的一些知識,相信大家會在其中找到對自己有用的模組。
APR庫
| 名稱 |
用途 |
| apr_allocator |
記憶體配置,內部使用 |
| apr_atomic |
原子操作 |
| apr_dso |
動態載入連結庫 |
| apr_env |
讀取/設定環境變數 |
| apr_errno |
定義錯誤的值、條件和宏 |
| apr_file_info |
檔案系統對象和路徑的屬性 |
| apr_file_io |
檔案系統輸入/輸出 |
| apr_global_mutex |
全域鎖 |
| apr_hash |
雜湊表 |
| apr_inherit |
檔案控制代碼繼承輔助 |
| apr_mmap |
記憶體映射 |
| apr_network_io |
網路輸入/輸出(通訊端) |
| apr_proc_mutex |
進程鎖 |
| apr_random |
隨機數 |
| apr_shm |
共用記憶體 |
| apr_signal |
訊號處理 |
| apr_strings |
字串操作 |
| apr_tables |
表格和數組函數 |
| apr_thread_cond |
線程條件 |
| apr_thread_mutex |
線程鎖 |
| apr_thread_proc |
線程和進程函數 |
| apr_thread_rwlock |
讀寫鎖 |
| apr_time |
時間/日期函數 |
| apr_usr |
使用者和組ID服務 |
可以見得,APR庫主要是對系統的相關操作做了封裝,從而實現Portable的能力。
我們再看下APR-UTIL庫部分模組(摘自《Apache模組開發指南》一書):
APR-UTIL庫
| 名稱 |
用途 |
| apr_anylock |
透明的、任何鎖的封裝 |
| apr_base64 |
Base64編碼 |
| apr_date |
時間字串解析 |
| apr_dbd |
針對SQL資料庫的常用API |
| apr_hooks |
鉤子實現宏 |
| apr_md4 |
MD4編碼 |
| apr_md5 |
MD5編碼 |
| apr_queue |
安全執行緒的FIFO隊列 |
| apr_sha1 |
SHA1編碼 |
| apr_strmatch |
字串模式比對 |
| apr_uri |
URI解析/構造 |
| apr_uuid |
使用者標識 |
| apr_xlate |
字元集轉換(I18N) |
| apr_xml |
XML解析 |
我們發現APR和APR-UTIL庫為我們提供了從記憶體配置到線程式控制制等作業系統相關的模組,也為我們提供了字串和XML以及一些簡單的編碼演算法庫。這些模組可以滿足我們一般的需求,我們只要將這些API組合好,使用對,便可以編寫Apache外掛程式了。
最後我們要介紹的是APR庫的一個基礎組件——APR pool。pool就是池,我們在以往的編程中經常會接觸到線程池、記憶體池這樣的概念。而APR pool就是APR中各種資源管理的池。作為C/C++程式員,在編程中我們往往需要處理各種記憶體配置和釋放問題——不討論智能指標這類知識。如果沒有深厚的功底和清晰的邏輯,記憶體泄露就是家常便飯。APR池就是要將程式員這種糾結中解脫出來。所以我們之後在Apache模組編程中,一旦涉及資源申請,就要優先考慮如何去使用這個池。
有了以上的基礎知識,我們便可以再小邁一步。下節我將介紹如何編寫一個http請求解析外掛程式。
伺服器架設筆記——Apache模組開發基礎知識