首頁 後端開發 php教程 thinkPHP5.0框架應用請求生命週期分析

thinkPHP5.0框架應用請求生命週期分析

May 07, 2018 am 09:54 AM
php thinkphp5.0

這篇文章主要介紹了thinkPHP5.0框架應用請求生命週期,較為詳細的分析了thinkPHP5.0框架應用請求生命週期所涉及的各個執行流程,需要的朋友可以參考下

#本文實例講述了thinkPHP5.0框架應用請求生命週期。分享給大家供大家參考,具體如下:

本篇內容我們對ThinkPHP5.0的應用請求的生命週期做大致的介紹,以便於開發者了解整個執行流程。

1、入口文件

用戶發起的請求都會經過套用的入口文件,通常是 public/index.php文件。當然,你也可以更改或增加新的入口文件。

通常入口檔案的程式碼都比較簡單,一個普通的入口檔案程式碼如下:

#
// 应用入口文件
// 定义项目路径
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
登入後複製

一般入口檔案已定義一些常數為主,支持的常數請參考後續的內容或附錄部分。

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

2、引導文件

接下來就是執行框架的引導文件,start.php檔案就是系統預設的一個引導文件。在引導檔案中,會依序執行下方操作:

① 載入系統常數定義;
② 載入環境變數定義檔;
③ 註冊自動載入機制;
④ 註冊錯誤和異常處理機制;
⑤ 載入慣例設定檔;
⑥ 執行應用程式;

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

3、註冊自動加載

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

系統的自動載入由兩個部分組成:

① 註冊系統的自動載入方法\think\Loader::autoload
② 註冊系統命名空間定義
③ 載入類別庫映射檔案(如果存在)
④ 如果存在Composer安裝,則註冊Composer自動載入
⑤ 註冊Extend擴充目錄

一個類別庫的自動載入偵測順序為:

① 是否定義類別庫映射;
② PSR-4自動載入偵測;
③ PSR-0自動載入偵測;

#可以看到,定義類別庫映射的方式是最有效率的。

4、註冊錯誤和異常機制

執行Error::register()註冊錯誤和例外處理機制。

由三個部分組成:

① 應用關閉方法:think\Error::appShutdown<br/>② 錯誤處理方法:think\Error:: appError<br/>③ 例外處理方法:think\Error::appException

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

在整個應用程式請求的生命週期過程中,如果拋出了異常或嚴重錯誤,都會導致應用程式提前結束,並回應輸出異常和錯誤訊息。

5、應用程式初始化

執行應用程式的第一步操作就是對應用程式進行初始化,包括:

載入應用程式(公共)配置;
載入應用程式狀態配置;
載入別名定義;
載入行為定義;
載入公用(函數)檔案;
載入擴充功能設定檔(由extra_config_list定義);
載入擴充功能檔案(由extra_file_list定義);
設定預設時區;
載入系統語言包;

##6、URL存取偵測

#應用初始化完成後,就會進行URL的存取偵測,包括PATH_INFO偵測和URL後綴偵測。

5.0的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']參數後才能繼續。

7、路由偵測

如果開啟了url_route_on參數的話,會先進行URL的路由偵測。

如果一旦偵測到符合的路由,根據定義的路由位址會註冊到對應的URL調度。

5.0的路由位址支援如下方式:

路由到模組/控制器/操作;路由到外部重定向位址;
路由到控制器方法;
路由到閉包函數;
路由到類別的方法;

路由位址可能會受網域綁定的影響。

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

如果在应用初始化的时候指定了应用调度方式,那么路由检测是可选的。

可以使用 \think\App::dispatch() 进行应用调度。

8、分发请求

在完成了URL检测和路由检测之后,路由器会分发请求到对应的路由地址,这也是应用请求的生命周期中最重要的一个环节。

在这一步骤中,完成应用的业务逻辑及数据返回。

建议统一使用return返回数据,而不是echo输出,如非必要,请不要执行exit中断。

直接echo输出的数据将无法进行自动转换响应输出的便利。

下面是系统支持的分发请求机制,可以根据情况选择:

模块/控制器/操作

这是默认的分发请求机制,系统会根据URL或者路由地址来判断当前请求的模块、控制器和操作名,并自动调用相应的访问控制器类,执行操作对应的方法。

该机制下面,首先会判断当前模块,并进行模块的初始化操作(和应用的初始化操作类似),模块的配置参数会覆盖应用的尚未生效的配置参数。

支持模块映射、URL参数绑定到方法,以及操作绑定到类等一些功能。

控制器方法

和前一种方式类似,只是无需判断模块、控制器和操作,直接分发请求到一个指定的控制器类的方法,因此没有进行模块的初始化操作。

外部重定向

可以直接分发请求到一个外部的重定向地址,支持指定重定向代码,默认为301重定向。

闭包函数

路由地址定义的时候可以直接采用闭包函数,完成一些相对简单的逻辑操作和输出。

类的方法

除了以上方式外,还支持分发请求到类的方法,包括:
静态方法:

&#39;blog/:id&#39;=>&#39;\org\util\Blog::read&#39;
登入後複製


类的方法:

&#39;blog/:id&#39;=>&#39;\app\index\controller\Blog@read&#39;
登入後複製

9、响应输出

控制器的所有操作方法都是return返回而不是直接输出,系统会调用Response::send方法将最终的应用返回的数据输出到页面或者客户端,并自动转换成default_return_type参数配置的格式。所以,应用执行的数据输出只需要返回一个正常的PHP数据即可。

10、应用结束

事实上,在应用的数据响应输出之后,应用并没真正的结束,系统会在应用输出或者中断后进行日志保存写入操作。

系统的日志包括用户调试输出的和系统自动生成的日志,统一会在应用结束的时候进行写入操作。

而日志的写入操作受日志初始化的影响。

相关推荐:

ThinkPHP框架中使用Memcached缓存数据的方法

thinkphp框架里用linux的crontab写php的定时脚本

以上是thinkPHP5.0框架應用請求生命週期分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1304
25
PHP教程
1251
29
C# 教程
1224
24
適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

See all articles