php底層深度探索(4) ---Apache運行階段分析 王澤賓

二、運行階段
     2.1 運行階段概述
    在運行階段,Apache主要工做是處理用戶的服務請求。
    在這個階段,Apache放棄特權用戶級別,使用普通權限,這主要是基於安全性的考慮,防止因爲代碼的缺陷引發的安全漏洞。象微軟的IIS就曾遭受「紅色代碼(Code Red)」和「尼姆達(Nimda)」等惡意代碼的溢出***。
 
 2.2 運行階段流程
    Apache將請求處理循環分爲11個階段,依次是:Post-Read-Request,URI Translation,Header Parsing,Access Control,Authentication,Authorization,MIME Type Checking,FixUp,Response,Logging,CleanUp。
 
     Apache Hook機制
     Apache的Hook機制是指:Apache 容許模塊(包括內部模塊和外部模塊,例如mod_php5.so,mod_perl.so等)將自定義的函數注入到請求處理循環中。換句話說,模塊能夠在Apache的任何一個處理階段中掛接(Hook)上本身的處理函數,從而參與Apache的請求處理過程。

    mod_php5.so/ php5apache2.dll就是將所包含的自定義函數,經過Hook機制注入到Apache中,在Apache處理流程的各個階段負責處理php請求。

    關於Hook機制在Windows系統開發也常常遇到,在Windows開發既有系統級的鉤子,又有應用級的鉤子。常見的翻譯軟件(例如金山詞霸等等)的屏幕取詞功能,大多數是經過安裝系統級鉤子函數完成的,將自定義函數替換gdi32.dll中的屏幕輸出的繪製函數。
 
    Apache請求處理循環詳解
    Apache請求處理循環的11個階段都作了哪些事情呢?
   
    一、Post-Read-Request階段
    在正常請求處理流程中,這是模塊能夠插入鉤子的第一個階段。對於那些想很早進入處理請求的模塊來講,這個階段能夠被利用。
    二、URI Translation階段
    Apache在本階段的主要工做:將請求的URL映射到本地文件系統。模塊能夠在這階段插入鉤子,執行本身的映射邏輯。mod_alias就是利用這個階段工做的。
    三、Header Parsing階段
    Apache在本階段的主要工做:檢查請求的頭部。因爲模塊能夠在請求處理流程的任何一個點上執行檢查請求頭部的任務,所以這個鉤子不多被使用。mod_setenvif就是利用這個階段工做的。
 
    四、Access Control階段
    Apache在本階段的主要工做:根據配置文件檢查是否容許訪問請求的資源。Apache的標準邏輯實現了容許和拒絕指令。mod_authz_host就是利用這個階段工做的。
    五、Authentication階段
     Apache在本階段的主要工做:按照配置文件設定的策略對用戶進行認證,並設定用戶名區域。模塊能夠在這階段插入鉤子,實現一個認證方法。
 
    六、Authorization階段
    Apache在本階段的主要工做:根據配置文件檢查是否容許認證過的用戶執行請求的操做。模塊能夠在這階段插入鉤子,實現一個用戶權限管理的方法。
    七、MIME Type Checking階段
    Apache在本階段的主要工做:根據請求資源的MIME類型的相關規則,斷定將要使用的內容處理函數。標準模塊mod_negotiation和mod_mime實現了這個鉤子。
    八、FixUp階段
    這是一個通用的階段,容許模塊在內容生成器以前,運行任何須要的處理流程。和Post_Read_Request相似,這是一個可以捕獲任何信息的鉤子,也是最常使用的鉤子。
    九、Response階段
    Apache在本階段的主要工做:生成返回客戶端的內容,負責給客戶端發送一個恰當的回覆。這個階段是整個處理流程的核心部分。
    十、Logging階段
    Apache在本階段的主要工做:在回覆已經發送給客戶端以後記錄事務。模塊可能修改或者替換Apache的標準日誌記錄。
 
    十一、CleanUp階段
    Apache在本階段的主要工做:清理本次請求事務處理完成以後遺留的環境,好比文件、目錄的處理或者Socket的關閉等等,這是Apache一次請求處理的最後一個階段。
 
    模塊的注入Apache的過程能夠參考源碼中server/core.c文件:
 
    mod_php5.so/ php5apache2.dll注入到Apache的函數中,最重要的就是Response階段的處理函數。

3、Php處理器注入Apache的過程剖析

0javascript

收藏css

wangzebin

33篇文章,32W+人氣,4粉絲

Ctrl+Enter 發佈html

發佈前端

取消java

6條評論jquery

按時間倒序 按時間正序

掃一掃,領取大禮包git

0ajax

6
分享
wangzebin
相關文章
相關標籤/搜索