對用戶的第一次URL訪問 http://<serverIp>/My/index.php/Index/show/ 所執行的流程進行詳細的分析,用戶的URL訪問首先是定位到了My項目的index.php 入口文件(注意:若是使用了URL_REWRITE,可能index.php已經被隱藏了),項目的入口文件所作的實際上是實例化一個App應用實例,而且執行這個應用。php
一、加載公共入口文件數據庫
在實例化App類以前,咱們須要首先加載系統的公共入口文件ThinkPHP.php,這個文件是ThinkPHP的總入口,讓咱們來一探究竟。在加載ThinkPHP.php文件的過程當中,其實完成了下面的操做:數組
記錄開始執行時間 $GLOBALS['_beginTime'];緩存
檢測THINK_PATH定義,若是沒有則建立;session
檢測項目名稱APP_NAME,若是沒有則按照必定規則自動定義;app
檢測項目編譯緩存目錄定義,沒有則取項目的Temp目錄;框架
加載系統定義文件defines.php和公共函數文件functions.php;函數
若是項目編譯緩存目錄不存在,則自動建立項目目錄結構;佈局
加載系統核心類庫(包括Base、App、Action、Model、View、ThinkException、Log);fetch
若是PHP版本低於5.2.0則加載兼容函數庫compat.php;
生成核心編譯緩存~runtime.php;
記錄加載文件時間 $GLOBALS['_loadTime'];
二、 項目初始化init
在加載完成ThinkPHP的公共入口文件以後,咱們就開始執行應用了,而首先應該是初始化App應用。
設定錯誤和異常處理機制(set_error_handler和set_exception_handler);
項目預編譯並載入;
設置時區支持;
Session過濾器檢查;
session初始化;
檢查並加載插件;
URL分析和調度;
獲取當前執行的模塊和操做名;
加載模塊配置文件;
頁面防刷新機制檢查;
語言檢查並讀取對應的語言文件;
模板檢查並定義相關的模板變量;
RBAC權限檢測;
若是開啓靜態寫入則讀取靜態緩存文件;
應用初始化過濾插件 app_init;
記錄應用初始化時間 $GLOBALS['_initTime']
三、 項目預編譯
加載系統慣例配置文件convention.php;
加載項目配置文件 config.php;
加載項目公共文件 common.php;
若是是調試模式加載系統調試配置文件 debug.php;
若是定義了項目的調試配置文件則載入 debug.php;
生成項目編譯緩存文件~app.php;
四、 URL分析Dispatcher
檢查當前URL模式URL_MODEL;
若是存在$_GET變量,則根據當前的URL模式和設置進行重定向;
進行路由定義檢測;
分析PATH_INFO的URL信息到數組;
把PATH_INFO獲得的值和$_GET合併;
五、 獲取模塊和操做名
檢查VAR_MODULE變量(包括GET 和POST),若是未定義,則獲取默認模塊名;
檢查組件模塊;
檢查模塊假裝;
檢查VAR_ACTION變量(包括GET 和POST),若是未定義,則獲取默認操做名;
檢查操做鏈;
檢查操做假裝;
六、 項目執行exec
AUTO_LOAD_CLASS 檢查 若是有則導入公共類;
實例化當前模塊的Action控制器類;
若是Action控制器不存在則檢查空模塊 EmptyAction;
檢查操做鏈,若是有執行操做鏈;
檢查前置操做方法 _before_操做名;
執行模塊的操做方法,調度轉移給Action控制器;
執行後置操做方法 _after_操做名;
執行應用結束過濾器 app_end;
若是開啓日誌記錄,寫入錯誤日誌;
七、 執行控制器的操做
實例化視圖類View;
取得當前控制器名稱;
控制器初始化_initialize;
若是操做方法不存在檢查空操做 _empty;
若是空操做沒有定義則檢查對應的模板文件;
調用模型獲取數據;
渲染視圖進行輸出;
八、 調用模型獲取數據find
實例化模型類;
模型初始化 _initialize;
判斷當前模型名稱和對應數據表;
實例化數據庫操做對象;
數據表字段檢測並緩存;
查詢須要的數據;
判斷是否視圖模型;
若是是延時查詢返回ResultIterator對象;
取出數據對象的時候記錄樂觀鎖;
獲取文本字段數據;
獲取關聯數據;
對數據對象自動編碼轉換;
記錄當前數據對象;
返回定義的數據格式(數組或者stdClass對象)
九、 輸出視圖
模板變量賦值;
檢測是不是佈局輸出;
檢測頁面輸出編碼;
緩存初始化過濾 ob_init;
頁面緩存開啓ob_start;
緩存開啓後執行的過濾;
模版文件名過濾 template_file;
定位當前輸出的模板文件;
模版變量過濾 template_var;
根據不一樣模版引擎進行處理;
若是是PHP模板引擎,直接載入模板文件;
使用內置模板引擎,檢測緩存有效期;
緩存無效則從新編譯模板文件;
載入模板緩存文件;
獲取並清空緩存;
輸出編碼轉換;
輸出過濾 ob_content;
開啓靜態寫入則寫入靜態文件;
若是輸出則獲取視圖運行時間;
若是是display則渲染模板輸出信息;
開啓頁面Trace則顯示頁面Trace信息;
若是是fetch則返回模板輸出信息;