system/core/CodeIgniter.php 是 CodeIgniter 框架的前端控制器,負責整個應用程式的啟動引導。本文基於 CI 2.1.3 版本,詳細梳理其 33 個關鍵執行步驟,幫助開發者理解框架底層運作機制,便於除錯、擴展或效能調優。
define('CI_VERSION', '2.1.3')。define('CI_CORE', FALSE),標識為 Reactor 分支(社區維護版)。require BASEPATH.'core/Common.php',提供 load_class()、log_message()、show_error() 等核心輔助函數。ENVIRONMENT 載入 application/config/{ENVIRONMENT}/constants.php 或預設 application/config/constants.php(定義檔案權限、檔案流模式等)。set_error_handler('_exception_handler'),統一記錄 PHP 錯誤至日誌。set_magic_quotes_runtime(0)(現代 PHP 已移除此特性)。index.php 中 $assign_to_config['subclass_prefix'] 覆寫配置,讓框架識別 application/libraries 下擴展核心類的類名(預設 MY_)。set_time_limit(300)(5 分鐘)。Benchmark 類,標記 total_execution_time_start、loading_time:_base_classes_start。config.php 啟用 $config['enable_hooks'] = TRUE 且定義 hooks.php,則載入 Hooks 類($EXT)。index.php 中的 $assign_to_config 覆寫項。$_SERVER['REQUEST_URI'],提取分段資訊。$RTR->_set_routing() 解析路由規則,決定控制器/方法;支援 index.php 中 $routing 覆寫。cache_override 鉤子,直接輸出快取並 exit。$_GET/$_POST/$_COOKIE 等超全域變數,提供安全取值方法。require BASEPATH.'core/Controller.php',定義 CI_Controller 及 get_instance() 單例存取器。application/core/MY_Controller.php(依 subclass_prefix),則載入以便繼承。include APPPATH.'controllers/...',若不存在拋出 404。$BM->mark('loading_time:_base_classes_end')。_ 開頭,非 CI_Controller 內建方法,否則導向 404 或 404_override 路由。$CI = new $class(),記錄 controller_execution_time_(class/method)_start。_remap($method, $params) 則呼叫它(完全接管路由)。is_callable 相容處理),不存在則 404 或 404_override。call_user_func_array([$CI, $method], $params) 執行。display_override 鉤子,呼叫 $OUT->_display() 發送給瀏覽器。CI_DB 類且 $CI->db 已初始化,呼叫 $CI->db->close()。load_class() 實例化並緩存,全域唯一(以引用返回 &$OBJ)。pre_system ~ post_system) 提供非侵入式擴展能力。{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 的初始化流程清晰、線性,核心類按依賴順序載入,鉤子機制提供強大擴展性。理解此流程有助於:
雖然 CI 3/4 版本架構有所演進,但前端控制器、單例核心類、鉤子/事件系統等核心思想保持一致,本文分析仍具參考價值。