CI 框架源碼解析一之入口文件 index.php

 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());

四、載入 core/CodeIgniter.php框架核心文件,啓動框架

 入口文件的最後一行,引入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

相關文章
相關標籤/搜索