對(duì)于一個(gè)HTTP應(yīng)用來(lái)說(shuō),從用戶發(fā)起請(qǐng)求到響應(yīng)輸出結(jié)束,大致的標(biāo)準(zhǔn)請(qǐng)求流程如下:
- 載入
Composer
的自動(dòng)加載autoload
文件
- 實(shí)例化系統(tǒng)應(yīng)用基礎(chǔ)類
think\App
- 獲取應(yīng)用目錄等相關(guān)路徑信息
- 加載全局的服務(wù)提供
provider.php
文件
- 設(shè)置容器實(shí)例及應(yīng)用對(duì)象實(shí)例,確保當(dāng)前容器對(duì)象唯一
- 從容器中獲取
HTTP
應(yīng)用類think\Http
- 執(zhí)行
HTTP
應(yīng)用類的run
方法啟動(dòng)一個(gè)HTTP
應(yīng)用
- 獲取當(dāng)前請(qǐng)求對(duì)象實(shí)例(默認(rèn)為
app\Request
繼承think\Request
)保存到容器
- 執(zhí)行
think\App
類的初始化方法initialize
- 加載環(huán)境變量文件
.env
和全局初始化文件
- 加載全局公共文件、系統(tǒng)助手函數(shù)、全局配置文件、全局事件定義和全局服務(wù)定義
- 判斷應(yīng)用模式(調(diào)試或者部署模式)
- 監(jiān)聽(tīng)
AppInit
事件
- 注冊(cè)異常處理
- 服務(wù)注冊(cè)
- 啟動(dòng)注冊(cè)的服務(wù)
- 加載全局中間件定義
- 監(jiān)聽(tīng)
HttpRun
事件
- 執(zhí)行全局中間件
- 執(zhí)行路由調(diào)度(
Route
類dispatch
方法)
- 如果開(kāi)啟路由則檢查路由緩存
- 加載路由定義
- 監(jiān)聽(tīng)
RouteLoaded
事件
- 如果開(kāi)啟注解路由則檢測(cè)注解路由
- 路由檢測(cè)(中間流程很復(fù)雜 略)
- 路由調(diào)度對(duì)象
think\route\Dispatch
初始化
- 設(shè)置當(dāng)前請(qǐng)求的控制器和操作名
- 注冊(cè)路由中間件
- 綁定數(shù)據(jù)模型
- 設(shè)置路由額外參數(shù)
- 執(zhí)行數(shù)據(jù)自動(dòng)驗(yàn)證
- 執(zhí)行路由調(diào)度子類的
exec
方法返回響應(yīng)think\Response
對(duì)象
- 獲取當(dāng)前請(qǐng)求的控制器對(duì)象實(shí)例
- 利用反射機(jī)制注冊(cè)控制器中間件
- 執(zhí)行控制器方法以及前后置中間件
- 執(zhí)行當(dāng)前響應(yīng)對(duì)象的
send
方法輸出
- 執(zhí)行HTTP應(yīng)用對(duì)象的
end
方法善后
- 監(jiān)聽(tīng)
HttpEnd
事件
- 執(zhí)行中間件的
end
回調(diào)
- 寫(xiě)入當(dāng)前請(qǐng)求的日志信息
至此,當(dāng)前請(qǐng)求流程結(jié)束。