thinkphp5的生命週期

一、入口文件
虛擬主機目錄/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訪問檢測

應用初始化完成後,就會進行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數據便可。

 

十、應用結束

事實上,在應用的數據響應輸出以後,應用並沒真正的結束,系統會在應用輸出或者中斷後進行日誌保存寫入操做。

系統的日誌包括用戶調試輸出的和系統自動生成的日誌,統一會在應用結束的時候進行寫入操做。

而日誌的寫入操做受日誌初始化的影響。

相關文章
相關標籤/搜索