![apache模塊化體系結(jié)構(gòu)簡(jiǎn)析[1]_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4081.gif)
![apache模塊化體系結(jié)構(gòu)簡(jiǎn)析[1]_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4082.gif)
![apache模塊化體系結(jié)構(gòu)簡(jiǎn)析[1]_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4083.gif)
![apache模塊化體系結(jié)構(gòu)簡(jiǎn)析[1]_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4084.gif)
![apache模塊化體系結(jié)構(gòu)簡(jiǎn)析[1]_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4085.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、apache模塊化體系結(jié)構(gòu)簡(jiǎn)析目錄_Toc251666385APACHE的體系結(jié)構(gòu)概述1APACHE核心功能層3APACHE核心組件3APACHE核心處理框架4APACHE可選功能層(模塊)4掛鉤(HOOK)5預(yù)定義標(biāo)準(zhǔn)掛鉤5掛鉤使用5掛鉤聲明5掛鉤數(shù)組聲明6掛鉤結(jié)構(gòu)6掛鉤注冊(cè)7掛鉤使用8APACHE 2.0系列的模塊結(jié)構(gòu)8模塊與核心的交互10APACHE的體系結(jié)構(gòu)概述APACHE采用了分層與模塊化的體系結(jié)構(gòu),如圖1所示。圖1 Apache分層與模塊化體系結(jié)構(gòu)加上操作系統(tǒng)層,整個(gè)Apache可以被分隔為五層,各層次的功能如下:(1)操作系統(tǒng)支持層,操作系統(tǒng)本身提供的底層功能,比如進(jìn)程和線程、進(jìn)
2、程和線程間的通信、網(wǎng)絡(luò)套接字通信、文件操作等。(2)可移植運(yùn)行庫(kù)層,不同的操作系統(tǒng)提供的底層API存在著很大的差異。對(duì)于Apache設(shè)計(jì)者而言,除了考慮WWW和服務(wù)器功能的實(shí)現(xiàn)之外,還必須考慮不同操作系統(tǒng)的API細(xì)節(jié)問(wèn)題。顯然,合理的做法就是將不同操作系統(tǒng)的底層細(xì)節(jié)封裝起來(lái)形成操作系統(tǒng)API的適配并將其隱藏起來(lái)。從Apache 2.0開(kāi)始,Apache就將專(zhuān)門(mén)封裝不同操作系統(tǒng)API的任務(wù)獨(dú)立出來(lái)形成一個(gè)新的項(xiàng)目APR,全稱為Apache可移植運(yùn)行庫(kù)(Apache Portable Runtime,APR)。APR的任務(wù)就是屏蔽底層的操作系統(tǒng)API細(xì)節(jié),對(duì)于所有的操作系統(tǒng),提供一個(gè)完全相同的函數(shù)
3、接口。這樣,Apache開(kāi)發(fā)者 就不必顧慮操作系統(tǒng)細(xì)節(jié),而只要開(kāi)發(fā)上層功能即可。比如對(duì)于進(jìn)程創(chuàng)建,如圖2所示。圖2 進(jìn)程創(chuàng)建不同的操作系統(tǒng)提供的創(chuàng)建進(jìn)程的API是不同的,Unix下通用的是fork(),Windows下則是 CreateProcess(),OS/2、Netware及BeOS中的API也迥然不同。APR將所有的創(chuàng)建細(xì)節(jié)封裝起來(lái),提供了統(tǒng)一的對(duì)外接口 apr_proc_create()。這樣,APR的使用者如果要?jiǎng)?chuàng)建進(jìn)程,則只須調(diào)用apr_proc_create(),不管它將要運(yùn)行于哪個(gè)操作系統(tǒng)平臺(tái)。APR的獨(dú)立帶來(lái)的另一個(gè)潛在的益處就是它將最終形成一個(gè)獨(dú)立的可移植運(yùn)行庫(kù)。因此,實(shí)
4、際上任何應(yīng)用程序如果要考慮跨平臺(tái),都可以使用它作為底層的支持。(3)核心功能層,包括兩大部分:Apache核心程序和Apache核心模塊。Apache的核心程序主要用于實(shí)現(xiàn)Apache作為HTTP服務(wù)器的基本功能,這些基本功能包括:?jiǎn)?dòng)和停止Apache,處理配置文件(config.c),接受和處理HTTP連接,讀取HTTP請(qǐng)求并對(duì)該請(qǐng)求進(jìn)行處理,處理HTTP協(xié)議。核心模塊,Apache中大部分模塊都是可選擇的,這意味著對(duì)于Apache而言是可有可無(wú)的。這些模塊的缺失至多影響Apache功能的完整性,并不影響運(yùn)行,比如mod_ssl、mod_alias等。但是有兩個(gè)模塊則是必需的,即mod_c
5、ore和 mod_so。前者負(fù)責(zé)處理配置文件中的大部分配置指令,并根據(jù)這些指令運(yùn)行Apache,而后者則負(fù)責(zé)動(dòng)態(tài)加載其余的模塊,缺少了該模塊,其余的模塊就無(wú)法使用。這兩個(gè)模塊都必須靜態(tài)編譯。對(duì)于Apache而言,另外一個(gè)重要的模塊就是MPM,即多進(jìn)程處理模塊。盡管MPM也是屬于可選擇的,但是它通常負(fù)責(zé)處理Apache中的并發(fā)模型,或者是Prefork,或者是線程池(ThreadPool),或者是Worker模型等。大多數(shù)情況下,它們總是會(huì)被加載,因此我們也將其視為核心的模塊。Apache核心(第三層)主要有以下兩個(gè)作用。基本的HTTP服務(wù)功能,Apache核心必須提供最基本的資源處理,或者通過(guò)
6、文件描述符,或者通過(guò)內(nèi)存段等來(lái)提供;維護(hù)多進(jìn)程運(yùn)行模型;在配置好的虛擬主機(jī)上偵聽(tīng) TCP/IP套接字;將接收到的客戶端請(qǐng)求傳遞給特定的處理進(jìn)程,處理HTTP協(xié)議狀態(tài),提供基本的讀入和寫(xiě)入緩沖區(qū)等。另外,核心部分還提供一些通用的功能,比如URL及MIME頭部解析,DSO模塊加載等。Apache Module API,Apache最基本的核心功能由Apache核心完成,除此之外,核心無(wú)法提供的功能則全部由模塊提供。為了允許這些模塊能夠完全控制Apache 的處理,Apache核心必須提供對(duì)應(yīng)的API。在Apache中,這些API是指每個(gè)模塊中包含一系列的函數(shù)(核心在處理HTTP請(qǐng)求的時(shí)候用來(lái)將消息
7、傳遞給模塊),以及一系列的以"apr"開(kāi)始的函數(shù)。(4)可選功能層,可選功能層通常指Apache模塊。按需載入,比如,如果需要Apache服務(wù)器支持安全套接字層(Secure Socket Layer,SSL),那么毫無(wú)疑問(wèn),我們必須將mod_ssl模塊加載到核心中。目前,Apache中的模塊很多,Apache能夠支持的完整的注冊(cè)過(guò)的模塊信息可以在上 查看。(5)第三方支持庫(kù),在Apache的一些模塊中會(huì)使用到第三方的開(kāi)發(fā)庫(kù),比如mod_ssl就使用了OpenSSL,mod_perl則使用了Perl開(kāi)發(fā)庫(kù)。這些第三方支持庫(kù)雖然
8、被Apache使用,但嚴(yán)格來(lái)說(shuō)它們并不屬于Apache的一部分。APACHE體系結(jié)構(gòu)的模塊化特點(diǎn)主要體現(xiàn)在第三層(核心功能層)與第四層(可選功能層),Apache采用的模塊化的體系結(jié)構(gòu),使它作為一個(gè)HTTP服務(wù)器的大部分功能都被分割為相互獨(dú)立的模塊,這樣,通過(guò)增加或刪除模塊就可以擴(kuò)展和修改Apache提供的功能。APACHE核心功能層APACHE核心功能層實(shí)現(xiàn)了APAPCHE作為一個(gè)HTTP服務(wù)器應(yīng)具備的基本功能,包括:?jiǎn)?dòng)和停止Apache,處理配置文件,接受和處理HTTP連接,讀取HTTP請(qǐng)求并對(duì)該請(qǐng)求進(jìn)行處理,處理HTTP協(xié)議等。APACHE核心組件從實(shí)現(xiàn)這些基本功能的源代碼來(lái)看,Apa
9、che的核心功能層可以有以下的幾個(gè)組件組成:配置文件組件(HTTP_CONFIG),進(jìn)程并發(fā)處理組件(MPM),連接處理組件(HTTP_CONNECTION),HTTP協(xié)議處理組件(HTTP_PROTOCOL),HTTP請(qǐng)求處理組件(HTTP_REQUEST),HTTP核心組件(HTTP_CORE),核心模塊組件(MOD_CORE),HTTP配置文件組件(HTTP_CONFIG)。(1)HTTP_CONFIG組件主要位于http_config.h和config.c中,對(duì)配置文件進(jìn)行解析、處理和保存。另外,HTTP_CONFIG組件還必須提供對(duì)配置數(shù)據(jù)訪問(wèn)的接口,其余組件在配置數(shù)據(jù)的任何時(shí)候都能
10、夠快地返回配置信息。(2)進(jìn)程并發(fā)處理組件(MPM),MPM組件主要位于mpm目錄下的各個(gè)文件中,比如Prefork MPM對(duì)應(yīng)的就是prefork.c。MPM負(fù)責(zé)為Apache系統(tǒng)提供可靠、穩(wěn)定、高效的進(jìn)程和線程的并發(fā)處理。任何時(shí)候,Apache中只能有一個(gè) MPM在運(yùn)行,而且MPM必須在編譯的時(shí)候指定,不允許動(dòng)態(tài)加載。(3)HTTP連接處理組件(HTTP_CONNECTION),HTTP_CONNECTION組件主要位于http_connection.h和connection.c中。該組件主要負(fù)責(zé)處理與HTTP連接相關(guān)的事情。(4)HTTP協(xié)議處理組件(HTTP_PROTOCOL),在Ap
11、ache 2.x系列中,HTTP_PROTOCOL組件主要位于http_protocol.h和http_protocol.c中,主要負(fù)責(zé)處理 HTTP/1.0及HTTP/1.1協(xié)議的解析,比如解析http請(qǐng)求頭、生成返回給客戶端的響應(yīng)包等。所有與協(xié)議相關(guān)的處理都由該組件完成。(5)HTTP請(qǐng)求處理組件(HTTP_REQUEST),HTTP_REQUEST組件主要位于http_request.h、http_request.c及request.c三個(gè)文件中。與 Apache 1.3相比,它增加了request.c文件。與請(qǐng)求相關(guān)的函數(shù)全部定義在http_request.h中,函數(shù)實(shí)現(xiàn)則分散在兩個(gè).
12、c中。(6)HTTP核心組件(HTTP_CORE),在APACHE2.x系列中,還增加了一個(gè)HTTP_CORE模塊,它位于文件http_core.h和http_core.c中,該組件主要是將與HTTP協(xié)議相關(guān)的內(nèi)容從原來(lái)的核心模塊中提取出來(lái)的。最早的時(shí)候,一些與HTTP協(xié)議相關(guān)的指令(如KeekpAliveTimeout、MaxKeepAliveRequests及KeepAlive)都是直接有core.c核心模塊完成的,這樣導(dǎo)致核心模塊與HTTP協(xié)議的耦合度過(guò)高,而APACHE的設(shè)計(jì)者想要把APACHE設(shè)計(jì)為一個(gè)通用的服務(wù)器,而不僅僅是一個(gè)Web服務(wù)器。(7)核心模塊組件(MOD_CORE),
13、核心模塊(MOD_CORE)由mod_core.h和core.c組成,該模塊的主要任務(wù)就是對(duì)核心需要的指令進(jìn)行比較,比如<Directory>、<Location>、DocumentRoot等。該模塊在HTTP_CONFIG中被調(diào)用。APACHE核心處理框架最終,APACHE的核心功能層構(gòu)造了HTTP服務(wù)器的基本功能的一個(gè)處理框架(流程),如圖3所示。圖3 APACHE核心處理框架這個(gè)框架包含了APAPCHE對(duì)一個(gè)HTTP請(qǐng)求的不同的處理階段。模塊擴(kuò)展APACHE的功能的實(shí)現(xiàn)是通過(guò)APACHE提供的一種機(jī)制:允許模塊針對(duì)特定的HTTP請(qǐng)求,在這個(gè)框架里的已有的一些階段中
14、增加一些額外的處理;允許模塊增加新的處理階段。APACHE可選功能層(模塊)APACHE核心層構(gòu)造了一個(gè)基本的處理框架,并且為這個(gè)框架的各個(gè)分支(即HTTP請(qǐng)求處理的各個(gè)階段)提供了默認(rèn)的實(shí)現(xiàn),從而實(shí)現(xiàn)了APACHE作為一個(gè)HTTP服務(wù)器應(yīng)具有的最基本的功能。也就是說(shuō),如果只有核心層的話,APACHE對(duì)一次HTTP的請(qǐng)求只做默認(rèn)的處理,例如:在這個(gè)處理框架的內(nèi)容生成階段,APACHE就是簡(jiǎn)單的將服務(wù)器上的文件(不管是html還是PHP)直接返回個(gè)客戶端,不做額外處理。這顯然不是我們想要的,應(yīng)該是根據(jù)文件類(lèi)型的不同做不同的處理之后再返回給客戶端。 APACHE核心層通過(guò)一種機(jī)制(接口)讓他構(gòu)造的
15、處理框架及其各個(gè)分支是可以擴(kuò)展的:可以增加額外的分支;可以在分支上增加額外的處理或者直接替代默認(rèn)的處理行為。APACHE模塊就是通過(guò)這個(gè)接口要么增加新的分支(如日志模塊),要么為新的分支增加額外的處理(如PHP模塊為內(nèi)容生成分支增加了對(duì)php文件進(jìn)行處理的功能)。 掛鉤(HOOK)之前,我們反復(fù)提到APACHE核心層提供了一種機(jī)制,這種機(jī)制使得APACHE模塊能夠擴(kuò)展核心層的功能。那么,這種機(jī)制其實(shí)就是這里我們要講的掛鉤。核心層實(shí)現(xiàn)了一個(gè)處理HTTP請(qǐng)求的基本框架,那么一個(gè)掛鉤就對(duì)對(duì)應(yīng)了這個(gè)處理框架中的一個(gè)分支,即一次HTTP請(qǐng)求的一個(gè)處理階段,核心層按照固定順序運(yùn)行每個(gè)掛鉤具體實(shí)現(xiàn)中的掛鉤調(diào)
16、用函數(shù),即,依次運(yùn)行HTTP請(qǐng)求的一個(gè)處理階段。模塊如何利用掛鉤進(jìn)行擴(kuò)展的呢?每一個(gè)掛鉤都對(duì)應(yīng)了多個(gè)掛鉤處理函數(shù),掛鉤處理函數(shù)具體處理HTTP請(qǐng)求,掛鉤調(diào)用函數(shù)按照三種方式(后面詳細(xì)介紹),調(diào)用掛鉤處理函數(shù),模塊通過(guò)增加新的掛鉤(即增加新的處理階段)或者為已有掛鉤增加新的掛鉤處理函數(shù),來(lái)實(shí)現(xiàn)對(duì)框架的擴(kuò)展,從而實(shí)現(xiàn)了模塊擴(kuò)展核心層的功能。預(yù)定義標(biāo)準(zhǔn)掛鉤在APACHE中,系統(tǒng)預(yù)定義了一些標(biāo)準(zhǔn)掛鉤操作,分為兩大類(lèi):?jiǎn)?dòng)掛鉤和請(qǐng)求掛鉤。啟動(dòng)掛鉤是隨著服務(wù)器啟動(dòng)進(jìn)行調(diào)用的掛鉤,包括:pre_config,post_config,open_logs,child_init。請(qǐng)求掛鉤則是服務(wù)器處理請(qǐng)求時(shí)進(jìn)行調(diào)
17、用的掛鉤,連接階段掛鉤:create_connection,pre_connection,process_connection;Keep-alive循環(huán)中的掛鉤:create_request,post_read_request;請(qǐng)求處理掛鉤:translate_name,map_to_storage,header_parser,access_checker,check_user_id,auth_checker,type_checker,fixups,insert_filter,handler;日志處理掛鉤:log_transaction。掛鉤使用使用一個(gè)掛鉤包括三個(gè)步驟:掛鉤聲明,為處理框架增
18、加一個(gè)新的分支(增加一個(gè)新的處理階段),只能聲明一次;掛鉤注冊(cè),對(duì)某個(gè)掛鉤(處理階段)感興趣,定義一個(gè)該掛鉤的掛鉤處理函數(shù),讓APACHE在這個(gè)階段對(duì)特定的HTTP請(qǐng)求做更多的處理;掛鉤調(diào)用,就是調(diào)用掛鉤的掛鉤調(diào)用函數(shù),掛鉤調(diào)用函數(shù)中按一定方式調(diào)用已注冊(cè)的掛鉤處理函數(shù)。掛鉤聲明Apache中預(yù)定義了一些標(biāo)準(zhǔn)掛鉤操作(見(jiàn)“預(yù)定義標(biāo)準(zhǔn)掛鉤”節(jié)),也可以聲明自己的掛鉤,如果一個(gè)模塊要關(guān)心一個(gè)嶄新的、其余任何模塊都沒(méi)有關(guān)心過(guò)的內(nèi)容,那么它必須在模塊內(nèi)部聲明該掛鉤。掛鉤只能被聲明一次。在Apache中聲明一個(gè)掛鉤,總是通過(guò)如下的宏來(lái)實(shí)現(xiàn)的。#define AP_DECLARE(type) type#de
19、fine APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name) link#_DECLARE(apr_array_header_t *) ns#_hook_get_#name(void)#define APR_DECLARE_EXTERNAL_HOOK(ns,link,ret,name,args) /*掛鉤函數(shù)類(lèi)型*/typedef ret ns#_HOOK_#name#_t args; /*掛鉤注冊(cè)函數(shù)原型*/link#_DECLARE(void) ns#_hook_#name(ns#_HOOK_#name#_t *pf, const char * const
20、*aszPre, const char * const *aszSucc, int nOrder); /*掛鉤調(diào)用函數(shù)原型*/link#_DECLARE(ret) ns#_run_#name args; APR_IMPLEMENT_HOOK_GET_PROTO(ns,link,name); /*結(jié)構(gòu)類(lèi)型,用來(lái)保存掛鉤的相關(guān)定義信息(如,掛鉤函數(shù)指針、掛鉤名等),同一個(gè)掛鉤會(huì)有多個(gè)模塊對(duì)其感興趣并實(shí)現(xiàn)該掛鉤,同一個(gè)掛鉤所有的實(shí)現(xiàn)都保存在一個(gè)鏈表中,鏈表中的每一個(gè)元素都是ns#_LINK_#name#_t 結(jié)構(gòu)。*/typedef struct ns#_LINK_#name#_t ns#_HOOK
21、_#name#_t *pFunc; const char *szName; const char * const *aszPredecessors; const char * const *aszSuccessors; int nOrder; ns#_LINK_#name#_t;#define AP_DECLARE_HOOK(ret,name,args) APR_DECLARE_EXTERNAL_HOOK(ap,AP,ret,name,args)ret是掛鉤函數(shù)與掛鉤調(diào)用函數(shù)的返回類(lèi)型,name是掛鉤名稱,args是掛鉤函數(shù)的參數(shù),通常以bracket形式出現(xiàn)。如:AP_DECLARE_HOO
22、K(int,do_something,(request_rec *r,int n)。掛鉤數(shù)組聲明對(duì)于同一掛鉤,不同模塊對(duì)應(yīng)于它的處理函數(shù)各不相同,為了能夠保存各個(gè)模塊對(duì)同一掛鉤的使用信息,APACHE核心使用apr_array_header_t數(shù)組保存對(duì)應(yīng)于該掛鉤的所有掛鉤函數(shù),該數(shù)組通過(guò)APR_HOOK_LINK聲明:#define APR_HOOK_LINK(name) apr_array_header_t *link_#name;link_#name數(shù)組中每個(gè)元素的類(lèi)型都是ap#_LINK_#name#_t結(jié)構(gòu),每個(gè)模塊關(guān)于該掛鉤的實(shí)現(xiàn)在link_#name中占有一個(gè)位置。掛鉤結(jié)構(gòu)對(duì)于每
23、一個(gè)掛鉤,APACHE都會(huì)定義一個(gè)apr_array_header_t數(shù)組來(lái)保存它的相關(guān)信息,每一個(gè)實(shí)現(xiàn)了該掛鉤的模塊,會(huì)通過(guò)某種方式在apr_array_header_t數(shù)組中插入一個(gè)ap#_LINK_#name#_t結(jié)構(gòu)。掛鉤的apr_array_header_t數(shù)組定義是在聲明該掛鉤的C文件中,并且該掛鉤數(shù)組將在整個(gè)APACHE中保持唯一,當(dāng)某個(gè)模塊想要使用該掛鉤的時(shí)候,只要訪問(wèn)模塊內(nèi)對(duì)應(yīng)的掛鉤數(shù)組即可。為了便于各模塊對(duì)數(shù)組的訪問(wèn),原則上必須將數(shù)組聲明為全局變量,這是最簡(jiǎn)單的方式。但是,APACHE2.0中并不支持直接訪問(wèn)掛鉤數(shù)組,引入了APR_HOOK_STRUCT宏,所有對(duì)數(shù)組的操作
24、都只能通過(guò)該宏來(lái)實(shí)現(xiàn)。#define APR_HOOK_STRUCT(members) static struct members _hooks;該宏定義了一個(gè)限于模塊內(nèi)使用的結(jié)構(gòu)_hooks,該模塊內(nèi)聲明的所有掛鉤對(duì)應(yīng)的數(shù)組都保存為_(kāi)hooks的成員,如:APR_HOOK_STRUCT(APR_HOOK_LINK(header_parser)APR_HOOK_LINK(pre_config)APR_HOOK_LINK(post_config)APR_HOOK_LINK(open_logs)APR_HOOK_LINK(child_init)APR_HOOK_LINK(handler)APR_H
25、OOK_LINK(quick_handler)APR_HOOK_LINK(optional_fn_retrieve)_hooks結(jié)構(gòu)的定義為static,該結(jié)構(gòu)是模塊內(nèi)的私有機(jī)構(gòu),外部模塊無(wú)法直接訪問(wèn)_hooks結(jié)構(gòu),并且只要聲明了掛鉤,就應(yīng)該有一個(gè)對(duì)應(yīng)的_hooks結(jié)構(gòu)。當(dāng)某個(gè)模塊想使用某個(gè)掛鉤,它既不能直接訪問(wèn)該掛鉤的掛鉤數(shù)組,也不能訪問(wèn)被屏蔽的模塊內(nèi)的_hooks結(jié)構(gòu),它只能使用該掛鉤的注冊(cè)函數(shù)ap_hook_name,ap_hook_name函數(shù)所做的事情是訪問(wèn)_hooks結(jié)構(gòu)中的某個(gè)數(shù)組,然后在數(shù)組中添加掛鉤處理函數(shù)。掛鉤注冊(cè)如果模塊對(duì)某個(gè)掛鉤感興趣,它就需要注冊(cè)對(duì)應(yīng)掛鉤的處理函數(shù)。
26、模塊對(duì)掛鉤函數(shù)的注冊(cè),通常是在模塊結(jié)構(gòu)中的register_hooks函數(shù)中調(diào)用對(duì)應(yīng)掛鉤的掛鉤注冊(cè)函數(shù)ap_hook_name來(lái)實(shí)現(xiàn)的。查遍APACHE的所有文件,也不能找到ap_hook_handler和ap_hook_post_config等函數(shù)聲明和實(shí)現(xiàn),因?yàn)閽煦^注冊(cè)函數(shù)是通過(guò)宏APR_IMPLEMENT_EXTERNAL_HOOK_BASE來(lái)實(shí)現(xiàn)的。#define APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ns,link,name) link#_DECLARE(void) ns#_hook_#name(ns#_HOOK_#name#_t *pf,const ch
27、ar * const *aszPre, const char * const *aszSucc,int nOrder) ns#_LINK_#name#_t *pHook; if(!_hooks.link_#name) _hooks.link_#name=apr_array_make(apr_hook_global_pool,1,sizeof(ns#_LINK_#name#_t); apr_hook_sort_register(#name,&_hooks.link_#name); pHook=apr_array_push(_hooks.link_#name); pHook->pFu
28、nc=pf; pHook->aszPredecessors=aszPre; pHook->aszSuccessors=aszSucc; pHook->nOrder=nOrder; pHook->szName=apr_hook_debug_current; if(apr_hook_debug_enabled) apr_hook_debug_show(#name,aszPre,aszSucc); 掛鉤使用掛鉤的使用實(shí)際上就是調(diào)用掛鉤對(duì)應(yīng)的掛鉤函數(shù)。所有的掛鉤對(duì)外提供的調(diào)用形式都是一樣的ap_run_HOOKNAME,但是內(nèi)部實(shí)現(xiàn)卻不盡相同,差別分別體現(xiàn)于三個(gè)宏:AP_IMP
29、LEMENT_HOOK_VOID、AP_IMPLEMENT_HOOK_RUN_FIRST及AP_IMPLEMENT_HOOK_RUN_ALL。AP_IMPLEMENT_HOOK_VOID,調(diào)用函數(shù)將遍歷掛鉤數(shù)組,逐個(gè)執(zhí)行針對(duì)該掛鉤的所有注冊(cè)過(guò)的掛鉤函數(shù),直到遍歷調(diào)用結(jié)束,它沒(méi)有任何返回值。AP_IMPLEMENT_HOOK_RUN_ALL類(lèi)型與AP_IMPLEMENT_HOOK_VOID幾乎相同,唯一的不同就是ALL類(lèi)型具有返回值。只有調(diào)用請(qǐng)求發(fā)生錯(cuò)誤時(shí)才會(huì)返回該錯(cuò)誤值,同時(shí)退出遍歷。AP_IMPLEMENT_HOOK_RUN_FIRST類(lèi)型,APACHE核心從頭逐一遍歷掛鉤數(shù)組中所注冊(cè)的掛鉤
30、函數(shù),直到遇到一個(gè)能夠完成所提交任務(wù)的函數(shù)或發(fā)生錯(cuò)誤為止。掛鉤函數(shù)允許返回四種值:DONE、OK、DECLINED及錯(cuò)誤碼。OK返回值意味著當(dāng)前的掛鉤處理函數(shù)已經(jīng)正確處理完畢。DECLINED返回值意味著當(dāng)前的模塊拒絕處理該結(jié)構(gòu),這實(shí)際上是通知apache核心應(yīng)該繼續(xù)查找其余模塊。DONE返回值意味著當(dāng)前模塊已經(jīng)完全完成了該掛鉤對(duì)應(yīng)階段的任務(wù),APACHE核心將不再繼續(xù)調(diào)用其余掛鉤,剩余的掛鉤中只有l(wèi)og_transaction會(huì)被調(diào)用。最后一種情況就是返回發(fā)生的錯(cuò)誤碼。APACHE 2.0系列的模塊結(jié)構(gòu)APACHE 2.0系列的模塊結(jié)構(gòu),如圖4所示。圖4 APACHE 2.0系列的模塊結(jié)構(gòu)描
31、述模塊本身的數(shù)據(jù)結(jié)構(gòu),即module_info。掛鉤注冊(cè)函數(shù),用于掛鉤注冊(cè),對(duì)應(yīng)register_hooks方框。模塊配置數(shù)據(jù)結(jié)構(gòu),對(duì)應(yīng)configuration方框。指令表,command_rec結(jié)構(gòu),描述了模塊能處理的指令及相應(yīng)的處理程序,對(duì)應(yīng)handlers方框。可選函數(shù),對(duì)應(yīng)optional functions方框。過(guò)濾器相關(guān)處理,對(duì)應(yīng)filters方框。Apache模塊以_module結(jié)尾,如alias_module、access_module等,對(duì)應(yīng)的文件名以mod_開(kāi)始,如mod_alias.c、mod_access.c等,在每一個(gè)模塊文件的末尾,都會(huì)存在一個(gè)模塊結(jié)構(gòu)。struc
32、t module_struct int version; int minor_version; int module_index; const char *name; void *dynamic_load_handle; struct module_struct *next; unsigned long magic;void (*rewrite_args) (process_rec *process); void *(*create_dir_config) (apr_pool_t *p, char *dir); void *(*merge_dir_config) (apr_pool_t *p,
33、 void *base_conf, void *new_conf); void *(*create_server_config) (apr_pool_t *p, server_rec *s); void *(*merge_server_config) (apr_pool_t *p, void *base_conf, void *new_conf); const command_rec *cmds; void (*register_hooks) (apr_pool_t *p);module結(jié)構(gòu)是整個(gè)模塊化體系結(jié)構(gòu)的核心部分,Apache核心服務(wù)總是通過(guò)module結(jié)構(gòu)與具體的模塊打交道,而該結(jié)構(gòu)
34、通常位于每個(gè)模塊文件的最末尾。version和minor_version是當(dāng)前Apache API版本號(hào),不是模塊的版本號(hào),通過(guò)這兩個(gè)字段,可檢測(cè)模塊是否與當(dāng)前的服務(wù)器兼容。APACHE核心通過(guò)模塊數(shù)組進(jìn)行模塊保存,每個(gè)模塊將當(dāng)前模塊在數(shù)組中的索引保存在模塊內(nèi)部,即module_index,要使用的時(shí)候,取出模塊的module_index,獲取數(shù)據(jù)中module_index索引出的數(shù)據(jù)。name用來(lái)記錄當(dāng)前模塊的名稱。dynamic_load_module是內(nèi)部的DSO處理句柄,通過(guò)該句柄可以動(dòng)態(tài)加載指定模塊。Apache的模塊之間通過(guò)next指針組成模塊鏈表。上述幾個(gè)字段不允許由模塊編寫(xiě)者自行賦值,因?yàn)槿魏巫侄纬霈F(xiàn)錯(cuò)誤都會(huì)使服務(wù)器變得不穩(wěn)定。APACHE開(kāi)發(fā)者提供了兩個(gè)宏填充初始的模塊結(jié)構(gòu),分別為STANDARD20_MODULE_STUFF(用于普通的APAHCE模塊)和MPM20_MODULE_
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 文化傳播與受眾心理的分析試題及答案
- 文化產(chǎn)業(yè)管理證書(shū)考試知識(shí)點(diǎn)試題及答案導(dǎo)讀
- 母豬行為研究的新趨勢(shì)的試題及答案
- 系統(tǒng)架構(gòu)設(shè)計(jì)的未來(lái)技術(shù)考題試題及答案
- 哲學(xué)常識(shí)綜合復(fù)習(xí)
- 高三政治:熱點(diǎn)最后預(yù)測(cè)試題八:“用工荒”
- 護(hù)士資格證考試法規(guī)題目及答案
- 激光技術(shù)常見(jiàn)考題回顧試題及答案
- 藥學(xué)文獻(xiàn)檢索技巧分享試題及答案
- 血培養(yǎng)的護(hù)理試題及答案
- 擔(dān)保人和被擔(dān)保人之間的協(xié)議范本
- 可愛(ài)的中國(guó)全冊(cè)教案
- 醫(yī)院品管圈10大步驟詳解課件
- 田野調(diào)查方法
- 設(shè)備基礎(chǔ)預(yù)埋施工方案【實(shí)用文檔】doc
- 高中音樂(lè)人音版高一上冊(cè)目錄鼓樂(lè)鏗鏘-錦雞出山(省一等獎(jiǎng))
- 西南18J202 坡屋面標(biāo)準(zhǔn)圖集
- 冶金企業(yè)(煉鐵廠)安全生產(chǎn)操作規(guī)程
- 新結(jié)構(gòu)資源與環(huán)境經(jīng)濟(jì)學(xué)知到章節(jié)答案智慧樹(shù)2023年南昌大學(xué)
- 中國(guó)船舶工業(yè)供應(yīng)商
- 公文流轉(zhuǎn)單(標(biāo)準(zhǔn)模版)
評(píng)論
0/150
提交評(píng)論