![apache模塊化體系結構簡析[1]_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4081.gif)
![apache模塊化體系結構簡析[1]_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4082.gif)
![apache模塊化體系結構簡析[1]_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4083.gif)
![apache模塊化體系結構簡析[1]_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4084.gif)
![apache模塊化體系結構簡析[1]_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/24/8e1ba475-0019-454b-b160-5cfb37f4c408/8e1ba475-0019-454b-b160-5cfb37f4c4085.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、apache模塊化體系結構簡析目錄_Toc251666385APACHE的體系結構概述1APACHE核心功能層3APACHE核心組件3APACHE核心處理框架4APACHE可選功能層(模塊)4掛鉤(HOOK)5預定義標準掛鉤5掛鉤使用5掛鉤聲明5掛鉤數(shù)組聲明6掛鉤結構6掛鉤注冊7掛鉤使用8APACHE 2.0系列的模塊結構8模塊與核心的交互10APACHE的體系結構概述APACHE采用了分層與模塊化的體系結構,如圖1所示。圖1 Apache分層與模塊化體系結構加上操作系統(tǒng)層,整個Apache可以被分隔為五層,各層次的功能如下:(1)操作系統(tǒng)支持層,操作系統(tǒng)本身提供的底層功能,比如進程和線程、進
2、程和線程間的通信、網(wǎng)絡套接字通信、文件操作等。(2)可移植運行庫層,不同的操作系統(tǒng)提供的底層API存在著很大的差異。對于Apache設計者而言,除了考慮WWW和服務器功能的實現(xiàn)之外,還必須考慮不同操作系統(tǒng)的API細節(jié)問題。顯然,合理的做法就是將不同操作系統(tǒng)的底層細節(jié)封裝起來形成操作系統(tǒng)API的適配并將其隱藏起來。從Apache 2.0開始,Apache就將專門封裝不同操作系統(tǒng)API的任務獨立出來形成一個新的項目APR,全稱為Apache可移植運行庫(Apache Portable Runtime,APR)。APR的任務就是屏蔽底層的操作系統(tǒng)API細節(jié),對于所有的操作系統(tǒng),提供一個完全相同的函數(shù)
3、接口。這樣,Apache開發(fā)者 就不必顧慮操作系統(tǒng)細節(jié),而只要開發(fā)上層功能即可。比如對于進程創(chuàng)建,如圖2所示。圖2 進程創(chuàng)建不同的操作系統(tǒng)提供的創(chuàng)建進程的API是不同的,Unix下通用的是fork(),Windows下則是 CreateProcess(),OS/2、Netware及BeOS中的API也迥然不同。APR將所有的創(chuàng)建細節(jié)封裝起來,提供了統(tǒng)一的對外接口 apr_proc_create()。這樣,APR的使用者如果要創(chuàng)建進程,則只須調(diào)用apr_proc_create(),不管它將要運行于哪個操作系統(tǒng)平臺。APR的獨立帶來的另一個潛在的益處就是它將最終形成一個獨立的可移植運行庫。因此,實
4、際上任何應用程序如果要考慮跨平臺,都可以使用它作為底層的支持。(3)核心功能層,包括兩大部分:Apache核心程序和Apache核心模塊。Apache的核心程序主要用于實現(xiàn)Apache作為HTTP服務器的基本功能,這些基本功能包括:啟動和停止Apache,處理配置文件(config.c),接受和處理HTTP連接,讀取HTTP請求并對該請求進行處理,處理HTTP協(xié)議。核心模塊,Apache中大部分模塊都是可選擇的,這意味著對于Apache而言是可有可無的。這些模塊的缺失至多影響Apache功能的完整性,并不影響運行,比如mod_ssl、mod_alias等。但是有兩個模塊則是必需的,即mod_c
5、ore和 mod_so。前者負責處理配置文件中的大部分配置指令,并根據(jù)這些指令運行Apache,而后者則負責動態(tài)加載其余的模塊,缺少了該模塊,其余的模塊就無法使用。這兩個模塊都必須靜態(tài)編譯。對于Apache而言,另外一個重要的模塊就是MPM,即多進程處理模塊。盡管MPM也是屬于可選擇的,但是它通常負責處理Apache中的并發(fā)模型,或者是Prefork,或者是線程池(ThreadPool),或者是Worker模型等。大多數(shù)情況下,它們總是會被加載,因此我們也將其視為核心的模塊。Apache核心(第三層)主要有以下兩個作用?;镜腍TTP服務功能,Apache核心必須提供最基本的資源處理,或者通過
6、文件描述符,或者通過內(nèi)存段等來提供;維護多進程運行模型;在配置好的虛擬主機上偵聽 TCP/IP套接字;將接收到的客戶端請求傳遞給特定的處理進程,處理HTTP協(xié)議狀態(tài),提供基本的讀入和寫入緩沖區(qū)等。另外,核心部分還提供一些通用的功能,比如URL及MIME頭部解析,DSO模塊加載等。Apache Module API,Apache最基本的核心功能由Apache核心完成,除此之外,核心無法提供的功能則全部由模塊提供。為了允許這些模塊能夠完全控制Apache 的處理,Apache核心必須提供對應的API。在Apache中,這些API是指每個模塊中包含一系列的函數(shù)(核心在處理HTTP請求的時候用來將消息
7、傳遞給模塊),以及一系列的以"apr"開始的函數(shù)。(4)可選功能層,可選功能層通常指Apache模塊。按需載入,比如,如果需要Apache服務器支持安全套接字層(Secure Socket Layer,SSL),那么毫無疑問,我們必須將mod_ssl模塊加載到核心中。目前,Apache中的模塊很多,Apache能夠支持的完整的注冊過的模塊信息可以在上 查看。(5)第三方支持庫,在Apache的一些模塊中會使用到第三方的開發(fā)庫,比如mod_ssl就使用了OpenSSL,mod_perl則使用了Perl開發(fā)庫。這些第三方支持庫雖然
8、被Apache使用,但嚴格來說它們并不屬于Apache的一部分。APACHE體系結構的模塊化特點主要體現(xiàn)在第三層(核心功能層)與第四層(可選功能層),Apache采用的模塊化的體系結構,使它作為一個HTTP服務器的大部分功能都被分割為相互獨立的模塊,這樣,通過增加或刪除模塊就可以擴展和修改Apache提供的功能。APACHE核心功能層APACHE核心功能層實現(xiàn)了APAPCHE作為一個HTTP服務器應具備的基本功能,包括:啟動和停止Apache,處理配置文件,接受和處理HTTP連接,讀取HTTP請求并對該請求進行處理,處理HTTP協(xié)議等。APACHE核心組件從實現(xiàn)這些基本功能的源代碼來看,Apa
9、che的核心功能層可以有以下的幾個組件組成:配置文件組件(HTTP_CONFIG),進程并發(fā)處理組件(MPM),連接處理組件(HTTP_CONNECTION),HTTP協(xié)議處理組件(HTTP_PROTOCOL),HTTP請求處理組件(HTTP_REQUEST),HTTP核心組件(HTTP_CORE),核心模塊組件(MOD_CORE),HTTP配置文件組件(HTTP_CONFIG)。(1)HTTP_CONFIG組件主要位于http_config.h和config.c中,對配置文件進行解析、處理和保存。另外,HTTP_CONFIG組件還必須提供對配置數(shù)據(jù)訪問的接口,其余組件在配置數(shù)據(jù)的任何時候都能
10、夠快地返回配置信息。(2)進程并發(fā)處理組件(MPM),MPM組件主要位于mpm目錄下的各個文件中,比如Prefork MPM對應的就是prefork.c。MPM負責為Apache系統(tǒng)提供可靠、穩(wěn)定、高效的進程和線程的并發(fā)處理。任何時候,Apache中只能有一個 MPM在運行,而且MPM必須在編譯的時候指定,不允許動態(tài)加載。(3)HTTP連接處理組件(HTTP_CONNECTION),HTTP_CONNECTION組件主要位于http_connection.h和connection.c中。該組件主要負責處理與HTTP連接相關的事情。(4)HTTP協(xié)議處理組件(HTTP_PROTOCOL),在Ap
11、ache 2.x系列中,HTTP_PROTOCOL組件主要位于http_protocol.h和http_protocol.c中,主要負責處理 HTTP/1.0及HTTP/1.1協(xié)議的解析,比如解析http請求頭、生成返回給客戶端的響應包等。所有與協(xié)議相關的處理都由該組件完成。(5)HTTP請求處理組件(HTTP_REQUEST),HTTP_REQUEST組件主要位于http_request.h、http_request.c及request.c三個文件中。與 Apache 1.3相比,它增加了request.c文件。與請求相關的函數(shù)全部定義在http_request.h中,函數(shù)實現(xiàn)則分散在兩個.
12、c中。(6)HTTP核心組件(HTTP_CORE),在APACHE2.x系列中,還增加了一個HTTP_CORE模塊,它位于文件http_core.h和http_core.c中,該組件主要是將與HTTP協(xié)議相關的內(nèi)容從原來的核心模塊中提取出來的。最早的時候,一些與HTTP協(xié)議相關的指令(如KeekpAliveTimeout、MaxKeepAliveRequests及KeepAlive)都是直接有core.c核心模塊完成的,這樣導致核心模塊與HTTP協(xié)議的耦合度過高,而APACHE的設計者想要把APACHE設計為一個通用的服務器,而不僅僅是一個Web服務器。(7)核心模塊組件(MOD_CORE),
13、核心模塊(MOD_CORE)由mod_core.h和core.c組成,該模塊的主要任務就是對核心需要的指令進行比較,比如<Directory>、<Location>、DocumentRoot等。該模塊在HTTP_CONFIG中被調(diào)用。APACHE核心處理框架最終,APACHE的核心功能層構造了HTTP服務器的基本功能的一個處理框架(流程),如圖3所示。圖3 APACHE核心處理框架這個框架包含了APAPCHE對一個HTTP請求的不同的處理階段。模塊擴展APACHE的功能的實現(xiàn)是通過APACHE提供的一種機制:允許模塊針對特定的HTTP請求,在這個框架里的已有的一些階段中
14、增加一些額外的處理;允許模塊增加新的處理階段。APACHE可選功能層(模塊)APACHE核心層構造了一個基本的處理框架,并且為這個框架的各個分支(即HTTP請求處理的各個階段)提供了默認的實現(xiàn),從而實現(xiàn)了APACHE作為一個HTTP服務器應具有的最基本的功能。也就是說,如果只有核心層的話,APACHE對一次HTTP的請求只做默認的處理,例如:在這個處理框架的內(nèi)容生成階段,APACHE就是簡單的將服務器上的文件(不管是html還是PHP)直接返回個客戶端,不做額外處理。這顯然不是我們想要的,應該是根據(jù)文件類型的不同做不同的處理之后再返回給客戶端。 APACHE核心層通過一種機制(接口)讓他構造的
15、處理框架及其各個分支是可以擴展的:可以增加額外的分支;可以在分支上增加額外的處理或者直接替代默認的處理行為。APACHE模塊就是通過這個接口要么增加新的分支(如日志模塊),要么為新的分支增加額外的處理(如PHP模塊為內(nèi)容生成分支增加了對php文件進行處理的功能)。 掛鉤(HOOK)之前,我們反復提到APACHE核心層提供了一種機制,這種機制使得APACHE模塊能夠擴展核心層的功能。那么,這種機制其實就是這里我們要講的掛鉤。核心層實現(xiàn)了一個處理HTTP請求的基本框架,那么一個掛鉤就對對應了這個處理框架中的一個分支,即一次HTTP請求的一個處理階段,核心層按照固定順序運行每個掛鉤具體實現(xiàn)中的掛鉤調(diào)
16、用函數(shù),即,依次運行HTTP請求的一個處理階段。模塊如何利用掛鉤進行擴展的呢?每一個掛鉤都對應了多個掛鉤處理函數(shù),掛鉤處理函數(shù)具體處理HTTP請求,掛鉤調(diào)用函數(shù)按照三種方式(后面詳細介紹),調(diào)用掛鉤處理函數(shù),模塊通過增加新的掛鉤(即增加新的處理階段)或者為已有掛鉤增加新的掛鉤處理函數(shù),來實現(xiàn)對框架的擴展,從而實現(xiàn)了模塊擴展核心層的功能。預定義標準掛鉤在APACHE中,系統(tǒng)預定義了一些標準掛鉤操作,分為兩大類:啟動掛鉤和請求掛鉤。啟動掛鉤是隨著服務器啟動進行調(diào)用的掛鉤,包括:pre_config,post_config,open_logs,child_init。請求掛鉤則是服務器處理請求時進行調(diào)
17、用的掛鉤,連接階段掛鉤:create_connection,pre_connection,process_connection;Keep-alive循環(huán)中的掛鉤:create_request,post_read_request;請求處理掛鉤:translate_name,map_to_storage,header_parser,access_checker,check_user_id,auth_checker,type_checker,fixups,insert_filter,handler;日志處理掛鉤:log_transaction。掛鉤使用使用一個掛鉤包括三個步驟:掛鉤聲明,為處理框架增
18、加一個新的分支(增加一個新的處理階段),只能聲明一次;掛鉤注冊,對某個掛鉤(處理階段)感興趣,定義一個該掛鉤的掛鉤處理函數(shù),讓APACHE在這個階段對特定的HTTP請求做更多的處理;掛鉤調(diào)用,就是調(diào)用掛鉤的掛鉤調(diào)用函數(shù),掛鉤調(diào)用函數(shù)中按一定方式調(diào)用已注冊的掛鉤處理函數(shù)。掛鉤聲明Apache中預定義了一些標準掛鉤操作(見“預定義標準掛鉤”節(jié)),也可以聲明自己的掛鉤,如果一個模塊要關心一個嶄新的、其余任何模塊都沒有關心過的內(nèi)容,那么它必須在模塊內(nèi)部聲明該掛鉤。掛鉤只能被聲明一次。在Apache中聲明一個掛鉤,總是通過如下的宏來實現(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ù)類型*/typedef ret ns#_HOOK_#name#_t args; /*掛鉤注冊函數(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); /*結構類型,用來保存掛鉤的相關定義信息(如,掛鉤函數(shù)指針、掛鉤名等),同一個掛鉤會有多個模塊對其感興趣并實現(xiàn)該掛鉤,同一個掛鉤所有的實現(xiàn)都保存在一個鏈表中,鏈表中的每一個元素都是ns#_LINK_#name#_t 結構。*/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ù)的返回類型,name是掛鉤名稱,args是掛鉤函數(shù)的參數(shù),通常以bracket形式出現(xiàn)。如:AP_DECLARE_HOO
22、K(int,do_something,(request_rec *r,int n)。掛鉤數(shù)組聲明對于同一掛鉤,不同模塊對應于它的處理函數(shù)各不相同,為了能夠保存各個模塊對同一掛鉤的使用信息,APACHE核心使用apr_array_header_t數(shù)組保存對應于該掛鉤的所有掛鉤函數(shù),該數(shù)組通過APR_HOOK_LINK聲明:#define APR_HOOK_LINK(name) apr_array_header_t *link_#name;link_#name數(shù)組中每個元素的類型都是ap#_LINK_#name#_t結構,每個模塊關于該掛鉤的實現(xiàn)在link_#name中占有一個位置。掛鉤結構對于每
23、一個掛鉤,APACHE都會定義一個apr_array_header_t數(shù)組來保存它的相關信息,每一個實現(xiàn)了該掛鉤的模塊,會通過某種方式在apr_array_header_t數(shù)組中插入一個ap#_LINK_#name#_t結構。掛鉤的apr_array_header_t數(shù)組定義是在聲明該掛鉤的C文件中,并且該掛鉤數(shù)組將在整個APACHE中保持唯一,當某個模塊想要使用該掛鉤的時候,只要訪問模塊內(nèi)對應的掛鉤數(shù)組即可。為了便于各模塊對數(shù)組的訪問,原則上必須將數(shù)組聲明為全局變量,這是最簡單的方式。但是,APACHE2.0中并不支持直接訪問掛鉤數(shù)組,引入了APR_HOOK_STRUCT宏,所有對數(shù)組的操作
24、都只能通過該宏來實現(xiàn)。#define APR_HOOK_STRUCT(members) static struct members _hooks;該宏定義了一個限于模塊內(nèi)使用的結構_hooks,該模塊內(nèi)聲明的所有掛鉤對應的數(shù)組都保存為_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結構的定義為static,該結構是模塊內(nèi)的私有機構,外部模塊無法直接訪問_hooks結構,并且只要聲明了掛鉤,就應該有一個對應的_hooks結構。當某個模塊想使用某個掛鉤,它既不能直接訪問該掛鉤的掛鉤數(shù)組,也不能訪問被屏蔽的模塊內(nèi)的_hooks結構,它只能使用該掛鉤的注冊函數(shù)ap_hook_name,ap_hook_name函數(shù)所做的事情是訪問_hooks結構中的某個數(shù)組,然后在數(shù)組中添加掛鉤處理函數(shù)。掛鉤注冊如果模塊對某個掛鉤感興趣,它就需要注冊對應掛鉤的處理函數(shù)。
26、模塊對掛鉤函數(shù)的注冊,通常是在模塊結構中的register_hooks函數(shù)中調(diào)用對應掛鉤的掛鉤注冊函數(shù)ap_hook_name來實現(xiàn)的。查遍APACHE的所有文件,也不能找到ap_hook_handler和ap_hook_post_config等函數(shù)聲明和實現(xiàn),因為掛鉤注冊函數(shù)是通過宏APR_IMPLEMENT_EXTERNAL_HOOK_BASE來實現(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); 掛鉤使用掛鉤的使用實際上就是調(diào)用掛鉤對應的掛鉤函數(shù)。所有的掛鉤對外提供的調(diào)用形式都是一樣的ap_run_HOOKNAME,但是內(nèi)部實現(xiàn)卻不盡相同,差別分別體現(xiàn)于三個宏:AP_IMP
29、LEMENT_HOOK_VOID、AP_IMPLEMENT_HOOK_RUN_FIRST及AP_IMPLEMENT_HOOK_RUN_ALL。AP_IMPLEMENT_HOOK_VOID,調(diào)用函數(shù)將遍歷掛鉤數(shù)組,逐個執(zhí)行針對該掛鉤的所有注冊過的掛鉤函數(shù),直到遍歷調(diào)用結束,它沒有任何返回值。AP_IMPLEMENT_HOOK_RUN_ALL類型與AP_IMPLEMENT_HOOK_VOID幾乎相同,唯一的不同就是ALL類型具有返回值。只有調(diào)用請求發(fā)生錯誤時才會返回該錯誤值,同時退出遍歷。AP_IMPLEMENT_HOOK_RUN_FIRST類型,APACHE核心從頭逐一遍歷掛鉤數(shù)組中所注冊的掛鉤
30、函數(shù),直到遇到一個能夠完成所提交任務的函數(shù)或發(fā)生錯誤為止。掛鉤函數(shù)允許返回四種值:DONE、OK、DECLINED及錯誤碼。OK返回值意味著當前的掛鉤處理函數(shù)已經(jīng)正確處理完畢。DECLINED返回值意味著當前的模塊拒絕處理該結構,這實際上是通知apache核心應該繼續(xù)查找其余模塊。DONE返回值意味著當前模塊已經(jīng)完全完成了該掛鉤對應階段的任務,APACHE核心將不再繼續(xù)調(diào)用其余掛鉤,剩余的掛鉤中只有l(wèi)og_transaction會被調(diào)用。最后一種情況就是返回發(fā)生的錯誤碼。APACHE 2.0系列的模塊結構APACHE 2.0系列的模塊結構,如圖4所示。圖4 APACHE 2.0系列的模塊結構描
31、述模塊本身的數(shù)據(jù)結構,即module_info。掛鉤注冊函數(shù),用于掛鉤注冊,對應register_hooks方框。模塊配置數(shù)據(jù)結構,對應configuration方框。指令表,command_rec結構,描述了模塊能處理的指令及相應的處理程序,對應handlers方框。可選函數(shù),對應optional functions方框。過濾器相關處理,對應filters方框。Apache模塊以_module結尾,如alias_module、access_module等,對應的文件名以mod_開始,如mod_alias.c、mod_access.c等,在每一個模塊文件的末尾,都會存在一個模塊結構。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結構是整個模塊化體系結構的核心部分,Apache核心服務總是通過module結構與具體的模塊打交道,而該結構
34、通常位于每個模塊文件的最末尾。version和minor_version是當前Apache API版本號,不是模塊的版本號,通過這兩個字段,可檢測模塊是否與當前的服務器兼容。APACHE核心通過模塊數(shù)組進行模塊保存,每個模塊將當前模塊在數(shù)組中的索引保存在模塊內(nèi)部,即module_index,要使用的時候,取出模塊的module_index,獲取數(shù)據(jù)中module_index索引出的數(shù)據(jù)。name用來記錄當前模塊的名稱。dynamic_load_module是內(nèi)部的DSO處理句柄,通過該句柄可以動態(tài)加載指定模塊。Apache的模塊之間通過next指針組成模塊鏈表。上述幾個字段不允許由模塊編寫者自行賦值,因為任何字段出現(xiàn)錯誤都會使服務器變得不穩(wěn)定。APACHE開發(fā)者提供了兩個宏填充初始的模塊結構,分別為STANDARD20_MODULE_STUFF(用于普通的APAHCE模塊)和MPM20_MODULE_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)三定工作總結
- 弘揚塞罕壩精神團日活動
- 2025年 車險理賠考試卷庫六附答案
- 創(chuàng)業(yè)培訓開班
- 手衛(wèi)生知識培訓主要內(nèi)容
- 銀行年度員工培訓方案
- 支原體肺炎檢查方法與診療規(guī)范
- 腫瘤患者的舒適與安全
- 中藥在腫瘤綜合治療中的應用
- 場地總監(jiān)全面職責協(xié)議書模板
- 陜西省安全生產(chǎn)條例
- 摜蛋大賽招商方案
- 電影特效制作課件
- 304不銹鋼管焊接工藝
- 網(wǎng)絡安全教育安全教育
- 醫(yī)療器械經(jīng)銷商和代理商法規(guī)義務
- 糖尿病專科護士培訓學習匯報課件
- 心理健康教育C證面試20個題目參考答案
- 危險化學品庫房貯存規(guī)定培訓課件
- Part 3-4 Unit 7 Invention and Innovation教案-【中職專用】高一英語精研課堂(高教版2021·基礎模塊2)
- 出租房(群租房)一戶一檔檢查表
評論
0/150
提交評論