一、入口文件
虛擬主機目錄/public/index.phpphp
二、引入啓動文件
虛擬主機目錄/thinkphp/start.phpthinkphp
三、運行App下面的run方法
虛擬主機目錄/thinkphp/library/think/App.php -> run() #69數組
四、實例化$request對象
虛擬主機目錄/thinkphp/library/think/App.php -> Request::instance(); #72瀏覽器
五、進行路由檢測
虛擬主機目錄/thinkphp/library/think/App.php -> self::routeCheck($request, $config); #107閉包
六、執行exec方法
虛擬主機目錄/thinkphp/library/think/App.php -> self::exec($dispatch, $config); #291app
七、根據dispatch數組裏面的type類型打開相對應的控制器
虛擬主機目錄/thinkphp/library/think/App.php -> self::module($result, $config, $convert = null); #334框架
八、調用Loader::controller經過反射機制加載控制器對象
虛擬主機目錄/thinkphp/library/think/App.php -> Loader::controller(...); #402函數
九、調用請求方法invokeMethod($method, $vars = [])
虛擬主機目錄/thinkphp/library/think/App.php -> self::invokeMethod(...); #187
十、調用$response對象中的send方法把數據輸出瀏覽器中
虛擬主機目錄/thinkphp/library/think/Response.php -> send(); #92ui
// 應用入口文件 index.php // 定義項目路徑 define('APP_PATH', __DIR__ . '/../application/'); // 加載框架引導文件 require __DIR__ . '/../thinkphp/start.php';
接下來就是執行框架的引導文件,start.php
文件就是系統默認的一個引導文件。在引導文件中,會依次執行下面操做:url
系統會調用Loader::register()
方法註冊自動加載,在這一步完成後,全部符合規範的類庫(包括Composer
依賴加載的第三方類庫)都將自動加載。
執行Error::register()
註冊錯誤和異常處理機制。
在整個應用請求的生命週期過程當中,若是拋出了異常或者嚴重錯誤,均會致使應用提早結束,並響應輸出異常和錯誤信息。
執行應用的第一步操做就是對應用進行初始化,包括:
extra_config_list
定義);extra_file_list
定義);應用初始化完成後,就會進行URL的訪問檢測,包括PATH_INFO
檢測和URL後綴檢測。PATH_INFO
因此,若是你的環境只能支持普通方式的URL參數訪問,那麼必須使用
http://serverName/index.php?s=/index/index/hello&val=value
路由地址可能會受域名綁定的影響。
在完成了URL檢測和路由檢測以後,路由器會分發請求到對應的路由地址,這也是應用請求的生命週期中最重要的一個環節。
在這一步驟中,完成應用的業務邏輯及數據返回。
建議統一使用return
返回數據,而不是echo
輸出,如非必要,請不要使用exit
或者die
中斷執行。
直接
echo
輸出的數據將沒法進行自動轉換響應輸出的便利。
除了以上方式外,還支持分發請求到類的方法,包括:
靜態方法: 'blog/:id'=>'\org\util\Blog::read'
類的方法:'blog/:id'=>'\app\index\controller\Blog@read'
控制器的全部操做方法都是return
返回而不是直接輸出,系統會調用Response::send
方法將最終的應用返回的數據輸出到頁面或者客戶端,並自動轉換成default_return_type
參數配置的格式。因此,應用執行的數據輸出只須要返回一個正常的PHP數據便可。
事實上,在應用的數據響應輸出以後,應用並沒真正的結束,系統會在應用輸出或者中斷後進行日誌保存寫入操做。
系統的日誌包括用戶調試輸出的和系統自動生成的日誌,統一會在應用結束的時候進行寫入操做。
而日誌的寫入操做受日誌初始化的影響。