天天看點

十、PHP核心探索:Apache運作與鈎子函數 ☞ Apache的運作過程

Apache是目前世界上使用最為廣泛的一種Web Server,它以跨平台、高效和穩定而聞名。按照去年官方統計的資料,Apache伺服器的裝機量占該市場60%以上的份額。尤其是在X(Unix/Linux)平台上,Apache是最常見的選擇。其它的Web Server産品,比如IIS,隻能運作在Windows平台上,是基于微軟.Net架構技術的不二選擇。

Apache并不是沒有缺點,它最為诟病的一點就是變得越來越重,被普遍認為是重量級的WebServer。是以,近年來又湧現出了很多輕量級的替代産品,比如lighttpd,nginx等等,這些WebServer的優點是運作效率很高,但缺點也很明顯,成熟度往往要低于Apache,通常隻能用于某些特定場合。

Apache的運作過程

Apache的運作分為啟動階段和運作階段。 在啟動階段,Apache為了獲得系統資源最大的使用權限,将以特權使用者root(*nix系統)或超級管理者Administrator(Windows系統)完成啟動, 并且整個過程處于一個單程序單線程的環境中。 這個階段包括配置檔案解析(如http.conf檔案)、子產品加載(如mod_php,mod_perl)和系統資源初始化(例如日志檔案、共享記憶體段、資料庫連接配接等)等工作。

Apache的啟動階段執行了大量的初始化操作,并且将許多比較慢或者花費比較高的操作都集中在這個階段完成,以減少了後面處理請求服務的壓力。

在運作階段,Apache主要工作是處理使用者的服務請求。 在這個階段,Apache放棄特權使用者級别,使用普通權限,這主要是基于安全性的考慮,防止由于代碼的缺陷引起的安全漏洞。 Apache對HTTP的請求可以分為連接配接、處理和斷開連接配接三個大的階段。同時也可以分為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中的螢幕輸出的繪制函數。

  1. Post-Read-Request階段。在正常請求處理流程中,這是子產品可以插入鈎子的第一個階段。對于那些想很早進入處理請求的子產品來說,這個階段可以被利用。
  2. URI Translation階段。Apache在本階段的主要工作:将請求的URL映射到本地檔案系統。子產品可以在這階段插入鈎子,執行自己的映射邏輯。mod_alias就是利用這個階段工作的。
  3. Header Parsing階段。Apache在本階段的主要工作:檢查請求的頭部。由于子產品可以在請求處理流程的任何一個點上執行檢查請求頭部的任務,是以這個鈎子很少被使用。mod_setenvif就是利用這個階段工作的。
  4. Access Control階段。 Apache在本階段的主要工作:根據配置檔案檢查是否允許通路請求的資源。Apache的标準邏輯實作了允許和拒絕指令。mod_authz_host就是利用這個階段工作的。
  5. Authentication階段。Apache在本階段的主要工作:按照配置檔案設定的政策對使用者進行認證,并設定使用者名區域。子產品可以在這階段插入鈎子,實作一個認證方法。
  6. Authorization階段。 Apache在本階段的主要工作:根據配置檔案檢查是否允許認證過的使用者執行請求的操作。子產品可以在這階段插入鈎子,實作一個使用者權限管理的方法。
  7. MIME Type Checking階段。Apache在本階段的主要工作:根據請求資源的MIME類型的相關規則,判定将要使用的内容處理函數。标準子產品mod_negotiation和mod_mime實作了這個鈎子。
  8. FixUp階段。這是一個通用的階段,允許子產品在内容生成器之前,運作任何必要的處理流程。和Post_Read_Request類似,這是一個能夠捕獲任何資訊的鈎子,也是最常使用的鈎子。
  9. Response階段。Apache在本階段的主要工作:生成傳回用戶端的内容,負責給用戶端發送一個恰當的回複。這個階段是整個處理流程的核心部分。
  10. Logging階段。Apache在本階段的主要工作:在回複已經發送給用戶端之後記錄事務。子產品可能修改或者替換Apache的标準日志記錄。
  11. CleanUp階段。 Apache在本階段的主要工作:清理本次請求事務處理完成之後遺留的環境,比如檔案、目錄的處理或者Socket的關閉等等,這是Apache一次請求處理的最後一個階段。