首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

CodeIgniter 核心源碼深度解析:系統初始化流程 (CodeIgniter.php)

     編輯:PHP 相關知識

前言

system/core/CodeIgniter.php 是 CodeIgniter 框架的前端控制器,負責整個應用程式的啟動引導。本文基於 CI 2.1.3 版本,詳細梳理其 33 個關鍵執行步驟,幫助開發者理解框架底層運作機制,便於除錯、擴展或效能調優。

初始化流程 33 步詳解

  1. 定義框架版本:define('CI_VERSION', '2.1.3')。
  2. 定義分支標識:define('CI_CORE', FALSE),標識為 Reactor 分支(社區維護版)。
  3. 載入全域函數:require BASEPATH.'core/Common.php',提供 load_class()、log_message()、show_error() 等核心輔助函數。
  4. 載入框架常數:依環境常數 ENVIRONMENT 載入 application/config/{ENVIRONMENT}/constants.php 或預設 application/config/constants.php(定義檔案權限、檔案流模式等)。
  5. 註冊自定義錯誤處理器:set_error_handler('_exception_handler'),統一記錄 PHP 錯誤至日誌。
  6. 關閉魔術引號:PHP < 5.3 時執行 set_magic_quotes_runtime(0)(現代 PHP 已移除此特性)。
  7. 設定子類前綴:檢查 index.php 中 $assign_to_config['subclass_prefix'] 覆寫配置,讓框架識別 application/libraries 下擴展核心類的類名(預設 MY_)。
  8. 設定腳本執行時間上限:非安全模式下 set_time_limit(300)(5 分鐘)。
  9. 啟動基準測試:實例化 Benchmark 類,標記 total_execution_time_start、loading_time:_base_classes_start。
  10. 實例化 Hooks 類:若 config.php 啟用 $config['enable_hooks'] = TRUE 且定義 hooks.php,則載入 Hooks 類($EXT)。
  11. 執行 pre_system 鉤子:最早的擴展點,框架剛啟動時觸發。
  12. 實例化 Config 類:載入配置檔,處理 index.php 中的 $assign_to_config 覆寫項。
  13. 實例化 Utf8 類:順序關鍵,必須在 Config 之後,因需讀取配置判斷 UTF-8 支援度。
  14. 實例化 URI 類:解析 $_SERVER['REQUEST_URI'],提取分段資訊。
  15. 實例化 Router 類並設定路由:$RTR->_set_routing() 解析路由規則,決定控制器/方法;支援 index.php 中 $routing 覆寫。
  16. 實例化 Output 類:負責最終輸出緩衝、壓縮、快取顯示。
  17. 檢查快取檔案:若存在有效快取且無 cache_override 鉤子,直接輸出快取並 exit。
  18. 實例化 Security 類:XSS 過濾、CSRF 保護初始化。
  19. 實例化 Input 類:清理 $_GET/$_POST/$_COOKIE 等超全域變數,提供安全取值方法。
  20. 實例化 Language 類:載入語言包。
  21. 載入基礎控制器類:require BASEPATH.'core/Controller.php',定義 CI_Controller 及 get_instance() 單例存取器。
  22. 載入應用程式核心控制器:若存在 application/core/MY_Controller.php(依 subclass_prefix),則載入以便繼承。
  23. 載入請求的具體控制器:根據 Router 解析結果 include APPPATH.'controllers/...',若不存在拋出 404。
  24. 標記基礎類載入結束:$BM->mark('loading_time:_base_classes_end')。
  25. 安全檢查:驗證控制器類/方法存在,方法名不以 _ 開頭,非 CI_Controller 內建方法,否則導向 404 或 404_override 路由。
  26. 執行 pre_controller 鉤子:控制器實例化前觸發。
  27. 實例化請求控制器並標記執行開始時間:$CI = new $class(),記錄 controller_execution_time_(class/method)_start。
  28. 執行 post_controller_constructor 鉤子:建構子執行完畢後觸發。
  29. 調用請求方法:
    • 若存在 _remap($method, $params) 則呼叫它(完全接管路由)。
    • 否則檢查方法是否存在且可呼叫(is_callable 相容處理),不存在則 404 或 404_override。
    • 最終以 call_user_func_array([$CI, $method], $params) 執行。
  30. 標記控制器執行結束時間。
  31. 執行 post_controller 鉤子。
  32. 輸出最終畫面:若無 display_override 鉤子,呼叫 $OUT->_display() 發送給瀏覽器。
  33. 執行 post_system 鉤子:框架結束前最後擴展點。
  34. 關閉資料庫連線:若存在 CI_DB 類且 $CI->db 已初始化,呼叫 $CI->db->close()。

關鍵設計模式與亮點

  • 前端控制器模式:單一入口統一調度,便於權限、快取、日誌等橫切關注點處理。
  • 延遲載入與單例:核心類透過 load_class() 實例化並緩存,全域唯一(以引用返回 &$OBJ)。
  • 鉤子系統:7 個標準鉤子點 (pre_system ~ post_system) 提供非侵入式擴展能力。
  • 基準測試內建:微秒級計時標記,Output 類最終替換 {elapsed_time}、{memory_usage} 標籤。
  • 快取短路機制:輸出類檢查快取優於安全/輸入類初始化,極大提升快取命中效能。

原始碼註釋重點(節錄)

// 核心類載入器,返回引用確保單例
$BM =& load_class('Benchmark', 'core');
$EXT =& load_class('Hooks', 'core');
$CFG =& load_class('Config', 'core');
// ...
// 安全檢查:防止私有/保護方法被 URL 直接呼叫
if ( ! class_exists($class) OR strncmp($method, '_', 1) == 0 OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller')))) {
    // 404 或 404_override 處理
}
// _remap 魔術方法支援
if (method_exists($CI, '_remap')) {
    $CI->_remap($method, array_slice($URI->rsegments, 2));
} else {
    call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
}

總結

CodeIgniter 的初始化流程清晰、線性,核心類按依賴順序載入,鉤子機制提供強大擴展性。理解此流程有助於:

  • 精準定位效能瓶頸(基準測試標記點)。
  • 正確使用鉤子進行 AOP 風格擴展(如權限檢查、日誌、多語言切換)。
  • 排查 404、路由不生效、快取不生效等常見問題。
  • 開發核心擴展庫(如自定義 Router、Output、Controller 基類)。

雖然 CI 3/4 版本架構有所演進,但前端控制器、單例核心類、鉤子/事件系統等核心思想保持一致,本文分析仍具參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved