thinkphp原始碼分析(一) 開門篇

2021-09-12 17:58:36 字數 3288 閱讀 7129

使用者發起的請求都會經過應用的入口檔案,通常是 ==public/index.php==檔案。當然,你也可以更改或者增加新的入口檔案。
通常入口檔案的**都比較簡單,乙個普通的入口檔案**如下:

// 應用入口檔案

// 定義專案路徑

// 載入框架引導檔案

require __dir__ . '/../thinkphp/start.php';

通常,我們不建議在應用入口檔案中加入過多的**,尤其是和業務邏輯相關的**。

接下來就是執行框架的引導檔案,start.php檔案就是系統預設的乙個引導檔案。在引導檔案中,會依次執行下面操作:
1. 載入系統常量定義;

2. 載入環境變數定義檔案;

3. 註冊自動載入機制;

4. 註冊錯誤和異常處理機制;

5. 載入慣例配置檔案;

6. 執行應用;

start.php引導檔案首先會呼叫base.php基礎引導檔案,某些特殊需求下面可能直接在入口檔案中引入基礎引導檔案。

如果在你的應用入口檔案中更改了預設的引導檔案,則上述執行流程可能會跟隨發生變化。

系統會呼叫 loader::register()方法註冊自動載入,在這一步完成後,所有符合規範的類庫(包括composer依賴載入的第三方類庫)都將自動載入。

系統的自動載入由下面主要部分組成:

1. 註冊系統的自動載入方法 \think\loader::autoload

2. 註冊系統命名空間定義

3. 載入類庫對映檔案(如果存在)

4. 如果存在composer安裝,則註冊**composer**自動載入

5. 註冊extend擴充套件目錄

乙個類庫的自動載入檢測順序為:

1. 是否定義類庫對映;

2. psr-4自動載入檢測;

3. psr-0自動載入檢測;

4. 可以看到,定義類庫對映的方式是最高效的。

執行error::register()註冊錯誤和異常處理機制。
由三部分組成:

註冊應用關閉方法是為了便於攔截一些系統錯誤。

在整個應用請求的生命週期過程中,如果丟擲了異常或者嚴重錯誤,均會導致應用提前結束,並響應輸出異常和錯誤資訊。

執行應用的第一步操作就是對應用進行初始化,包括:
1. 載入應用(公共)配置;

2. 載入擴充套件配置檔案(由extra_config_list定義);

3. 載入應用狀態配置;

4. 載入別名定義;

5. 載入行為定義;

6. 載入公共(函式)檔案;

7. 註冊應用命名空間;

8. 載入擴充套件函式檔案(由extra_file_list定義);

9. 設定預設時區;

10. 載入系統語言包;

應用初始化完成後,就會進行url的訪問檢測,包括path_info檢測和url字尾檢測。
http://servername/index.php/index/index/hello/val/value
所以,如果你的環境只能支援普通方式的url引數訪問,那麼必須使用

http://servername/index.php?s=/index/index/hello&val=value
如果是命令列下面訪問入口檔案的話,則通過

$ php index.php index/index/hello/val/value...
獲取到正常的 ==$_server['path_info']== 引數後才能繼續。

如果開啟了url_route_on引數的話,會首先進行url的路由檢測。
如果一旦檢測到匹配的路由,根據定義的路由位址會註冊到相應的url排程。

1. 路由到模組/控制器/操作;

2. 路由到外部重定向位址;

3. 路由到控制器方法;

4. 路由到閉包函式;

5. 路由到類的方法;

6. 路由位址可能會受網域名稱繫結的影響。

如果關閉路由或者路由檢測無效則進行預設的模組/控制器/操作的分析識別。

如果在應用初始化的時候指定了應用排程方式,那麼路由檢測是可選的。

在完成了url檢測和路由檢測之後,路由器會分發請求到對應的路由位址,這也是應用請求的生命週期中最重要的乙個環節。
在這一步驟中,完成應用的業務邏輯及資料返回。

建議統一使用return返回資料,而不是echo輸出,如非必要,請不要使用exit或者die中斷執行。

直接echo輸出的資料將無法進行自動轉換響應輸出的便利。

下面是系統支援的分發請求機制,可以根據情況選擇:

模組/控制器/操作

這是預設的分發請求機制,系統會根據url或者路由位址來判斷當前請求的模組、控制器和操作名,並自動呼叫相應的訪問控制器類,執行操作對應的方法。

該機制下面,首先會判斷當前模組,並進行模組的初始化操作(和應用的初始化操作類似),模組的配置引數會覆蓋應用的尚未生效的配置引數。

支援模組對映、url引數繫結到方法,以及操作繫結到類等一些功能。

控制器方法

和前一種方式類似,只是無需判斷模組、控制器和操作,直接分發請求到乙個指定的控制器類的方法,因此沒有進行模組的初始化操作。

外部重定向

可以直接分發請求到乙個外部的重定向位址,支援指定重定向**,預設為301重定向。

閉包函式

路由位址定義的時候可以直接採用閉包函式,完成一些相對簡單的邏輯操作和輸出。

類的方法

除了以上方式外,還支援分發請求到類的方法,包括:

靜態方法: 'blog/:id'=>'\org\util\blog::read'
控制器的所有操作方法都是return返回而不是直接輸出,系統會呼叫response::send方法將最終的應用返回的資料輸出到頁面或者客戶端,並自動轉換成default_return_type引數配置的格式。所以,應用執行的資料輸出只需要返回乙個正常的php資料即可。

事實上,在應用的資料響應輸出之後,應用並沒真正的結束,系統會在應用輸出或者中斷後進行日誌儲存寫入操作。

系統的日誌包括使用者除錯輸出的和系統自動生成的日誌,統一會在應用結束的時候進行寫入操作。

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

thinkphp原始碼分析(一) 開門篇

使用者發起的請求都會經過應用的入口檔案,通常是 public index.php 檔案。當然,你也可以更改或者增加新的入口檔案。通常入口檔案的 都比較簡單,乙個普通的入口檔案 如下 應用入口檔案 定義專案路徑 載入框架引導檔案 require dir thinkphp start.php 通常,我們...

thinkphp原始碼分析(二) 入口篇

使用者發起的請求都會經過應用的入口檔案,通常是 public index.php 檔案。當然,你也可以更改或者增加新的入口檔案。通常入口檔案的 都比較簡單,乙個普通的入口檔案 如下 應用入口檔案 定義專案路徑 載入框架引導檔案 require dir thinkphp start.php 通常,我們...

thinkphp原始碼分析(二) 入口篇

使用者發起的請求都會經過應用的入口檔案,通常是 public index.php 檔案。當然,你也可以更改或者增加新的入口檔案。通常入口檔案的 都比較簡單,乙個普通的入口檔案 如下 應用入口檔案 定義專案路徑 載入框架引導檔案 require dir thinkphp start.php 通常,我們...