Index.php做爲CI框架的入口文件,源碼分析,天然而然由此開始。在源碼分析的過程當中,咱們並不會逐行進行解釋,而只解釋核心的功能和實現,若是英文水平很好的話,讀過index.php文件的英文註釋以後也就基本明白了inde.php都作了些什麼。原本想第一篇寫解析CI框架的目錄結構的,像這通常網上一搜都是一大堆,也就放棄了這個想法。博主是基於CodeIgniter-v3.1.0最新版本進行解讀分析。ok,書歸正傳,在博主看來CI框架的index.php文件一共完成了四項工做:php
① 設置框架應用的環境狀態前端
② 配置系統、應用、視圖等程序目錄以及獲得其路徑數據庫
③ 系統、應用、視圖等目錄的正確性驗證bootstrap
④ 載入 core/CodeIgniter.php框架核心文件,啓動框架php框架
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
這裏的development能夠是任何你喜歡的環境名稱(好比working,再如debug),相對應的,你要在下面的switch case代碼塊中,對設定的環境作相關的錯誤等級控制。(CI框架設置了三種應用場景狀態,分別是:development(開發),testing(測試),production(產品)。development(開發)狀態,也就是默認的狀態下會產生錯誤報告,testing(測試),production(產品)狀態下則不會產生錯誤報告)不然,CI框架會認爲你沒有配置好相應的環境,從而退出進程並給出對應的錯誤信息:微信
default: //header() 被用來發送自定義的 HTTP 報文。關於HTTP報文的更多信息請參考php手冊 header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); echo 'The application environment is not set correctly.'; exit(1);
之因此必定要配置配置ENVIRONMENT?這是由於,CI框架中不少組件都依賴於ENVIRONMENT的配置,例如,查看system/config/Common.php, 這其中有一段引入配置文件的代碼,是這樣實現的:app
if (file_exists(APPPATH . 'config/' . ENVIRONMENT . '/mimes.php')) { $_mimes = include(APPPATH . 'config/' . ENVIRONMENT . '/mimes.php'); } elseif (file_exists(APPPATH . 'config/mimes.php')) { $_mimes = include(APPPATH . 'config/mimes.php'); } else { $_mimes = array(); }
在CI框架中,不少配置文件都是經過這種方式引入的,所以ENVRIONMENT對於CI框架的正確運行時必須的,因此須要在開始的時候配置好ENVIRONMENT。設置ENVIRONMENT的一個好處是:能夠很方便的切換系統的配置而沒必要修改系統代碼。例如,在系統進入測試階段時,database配置爲測試的數據庫,而在系統測試完畢時,database切換到線上的數據庫。這比如是用一個開關控制了系統的環境切換,天然是很是方便的。框架
CI框架容許你將系統核心源碼和應用程序代碼進行分開放置,可是你必須設定好系統的system文件夾和application文件夾(一樣,文件夾名字能夠是任何合法的文件夾名稱,而不必定使用’system’和’application’)的名稱、路徑等信息:函數
//定義系統目錄名稱 $system_path = 'system'; //定義你的應用目錄名稱 $application_folder = 'application'; //視圖文件存放目錄 //若是要將視圖目錄移到應用程序目錄,則設置在此處的路徑。若是空白,它將默認爲您的應用程序目錄中的標準位置。 $view_folder = '';
下面有這樣一段代碼,而後不少人就不明白爲何要放這樣幾句代碼了,在這裏特別說明一下:源碼分析
if (defined('STDIN')) { //chdir函數用來改變目錄 chdir(dirname(__FILE__)); }
這段代碼主要是用來幹嗎的呢?首先,STDIN、STDOUT、STDERR是PHP以 CLI(Command Line Interface)模式運行而定義的三個常量,這三個常量相似於Shell的stdin,stdout,stdout,分別是PHP CLI模式下的標準輸入、標準輸出和標準錯誤流。也就是說,這三行代碼是爲了保證命令行模式下,CI框架能夠正常運行。
1) 系統(system)文件目錄的正確性驗證
//獲得規範化的絕對路徑名 //此段代碼用於判斷生成system系統文件目錄 if (($_temp = realpath($system_path)) !== FALSE) { //$system_path就是當前你的CI框架核心文件所存放的絕對路徑名 $system_path = $_temp . DIRECTORY_SEPARATOR; } else { $system_path = strtr(rtrim($system_path, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; } //若是$system_path所指向的文件目錄不存在,則die if (!is_dir($system_path)) { header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); echo 'Your system folder path does not appear to be set correctly. Please open the following file and correct this: ' . pathinfo(__FILE__, PATHINFO_BASENAME); exit(3); // EXIT_CONFIG }
2) 應用(application)文件目錄的正確性驗證
//此段代碼用於判斷生成application應用文件目錄 if (is_dir($application_folder)) { if (($_temp = realpath($application_folder)) !== FALSE) { $application_folder = $_temp; } else { $application_folder = strtr(rtrim($application_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR); } } elseif (is_dir(BASEPATH . $application_folder . DIRECTORY_SEPARATOR)) { $application_folder = BASEPATH . strtr(trim($application_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR); } else { header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: ' . SELF; exit(3); }
3) 視圖(view)文件目錄的正確性驗證
//此段代碼用於判斷生成view視圖文件目錄 if (!isset($view_folder[0]) && is_dir(APPPATH . 'views' . DIRECTORY_SEPARATOR)) { $view_folder = APPPATH . 'views'; } elseif (is_dir($view_folder)) { if (($_temp = realpath($view_folder)) !== FALSE) { $view_folder = $_temp; } else { $view_folder = strtr(rtrim($view_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR); } } elseif (is_dir(APPPATH . $view_folder . DIRECTORY_SEPARATOR)) { $view_folder = APPPATH . strtr(trim($view_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR); } else { header('HTTP/1.1 503 Service Unavailable.', TRUE, 503); echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: ' . SELF; exit(3); }
幾個定義的常量(PATH結尾的常量表示目錄路徑,DIR結尾的變量表示目錄名):
//SELF(這裏指index.php文件) define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME)); //BASEPATH(system文件夾的路徑) define('BASEPATH', $system_path); //FCPATH(前端控制器的路徑) define('FCPATH', dirname(__FILE__) . DIRECTORY_SEPARATOR); //SYSDIR(系統system目錄名) define('SYSDIR', basename(BASEPATH)); //APPPATH(應用程序路徑) define('APPPATH', $application_folder . DIRECTORY_SEPARATOR); //VIEWPATH(視圖目錄路徑) define('VIEWPATH', $view_folder . DIRECTORY_SEPARATOR);
注:查看全部常量的方法:
var_dump(get_defined_constants());
入口文件的最後一行,引入CodeIgniter.php框架核心文件(也是下一步框架執行的關鍵)。CodeIgniter.php被稱爲bootstrap file,也就是它是一個引導文件,是CI框架執行流程的核心文件
//最後就是加載CI框架的核心引導文件了 require_once BASEPATH . 'core/CodeIgniter.php';
總結一下,index.php並無作太多複雜的工做,而是相似軍隊中押運糧草的,兵馬未動糧草先行,爲CI框架的運行提供了一系列配置參數和正確性驗證,而這些配置和驗證,是CI框架可以正常運行的關鍵。
文章轉自:https://blog.csdn.net/zhihua_w/article/details/52815892
關注微信公衆號:lovephp