tp框架生命周期

1、入口文件

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

通常入口文件的代碼都比較簡單,一個普通的入口文件代碼如下:

// 應用入口文件

// 定義項目路徑
define('APP_PATH', __DIR__ . '/../application/');
// 加載框架引導文件
require __DIR__ . '/../thinkphp/start.php';

一般入口文件以定義一些常量為主,支持的常量請參考后續的內容或者附錄部分。

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

2、引導文件

接下來就是執行框架的引導文件,start.php文件就是系統默認的一個引導文件。在引導文件中,會依次執行下面操作:

1.加載系統常量定義;
2.加載環境變量定義文件;
3.注冊自動加載機制;
4.注冊錯誤和異常處理機制;
5.加載慣例配置文件;
6.執行應用;
start.php引導文件首先會調用base.php基礎引導文件,某些特殊需求下面可能直接在入口文件中引入基礎引導文件。

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

3、注冊自動加載

系統會調用 Loader::register()方法注冊自動加載,在這一步完成后,所有符合規范的類庫(包括Composer依賴加載的第三方類庫)都將自動加載。

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

注冊系統的自動加載方法 \think\Loader::autoload
注冊系統命名空間定義
加載類庫映射文件(如果存在)
如果存在Composer安裝,則注冊Composer自動加載
注冊extend擴展目錄
一個類庫的自動加載檢測順序為:

是否定義類庫映射;
PSR-4自動加載檢測;
PSR-0自動加載檢測;
可以看到,定義類庫映射的方式是最高效的。

4、注冊錯誤和異常機制

執行Error::register()注冊錯誤和異常處理機制。

由三部分組成:

應用關閉方法:think\Error::appShutdown
錯誤處理方法:think\Error::appError
異常處理方法: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
如果是命令行下面訪問入口文件的話,則通過

phpindex.phpindex/index/hello/val/value...獲取到正常的php index.php index/index/hello/val/value... 獲取到正常的phpindex.phpindex/index/hello/val/value..._SERVER[‘PATH_INFO’]參數后才能繼續。

7、路由檢測

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

如果一旦檢測到匹配的路由,根據定義的路由地址會注冊到相應的URL調度。
5.0的路由地址支持如下方式:

路由到模塊/控制器/操作;
路由到外部重定向地址;
路由到控制器方法;
路由到閉包函數;
路由到類的方法;
路由地址可能會受域名綁定的影響。

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

如果在應用初始化的時候指定了應用調度方式,那么路由檢測是可選的。
可以使用 \think\App::dispatch() 進行應用調度,例如:
App::dispatch([‘type’ => ‘module’, ‘module’ => ‘index/index’]);

8、分發請求

在完成了URL檢測和路由檢測之后,路由器會分發請求到對應的路由地址,這也是應用請求的生命周期中最重要的一個環節。

在這一步驟中,完成應用的業務邏輯及數據返回。

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

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

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

模塊/控制器/操作
這是默認的分發請求機制,系統會根據URL或者路由地址來判斷當前請求的模塊、控制器和操作名,并自動調用相應的訪問控制器類,執行操作對應的方法。
該機制下面,首先會判斷當前模塊,并進行模塊的初始化操作(和應用的初始化操作類似),模塊的配置參數會覆蓋應用的尚未生效的配置參數。

支持模塊映射、URL參數綁定到方法,以及操作綁定到類等一些功能。

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

外部重定向
可以直接分發請求到一個外部的重定向地址,支持指定重定向代碼,默認為301重定向。

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

類的方法
除了以上方式外,還支持分發請求到類的方法,包括:
靜態方法: ‘blog/:id’=>’\org\util\Blog::read’
類的方法:‘blog/:id’=>’\app\index\controller\Blog@read’

9、響應輸出

控制器的所有操作方法都是return返回而不是直接輸出,系統會調用Response::send方法將最終的應用返回的數據輸出到頁面或者客戶端,并自動轉換成default_return_type參數配置的格式。所以,應用執行的數據輸出只需要返回一個正常的PHP數據即可。

10、應用結束

事實上,在應用的數據響應輸出之后,應用并沒真正的結束,系統會在應用輸出或者中斷后進行日志保存寫入操作。

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393511.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

django 創建mysql失敗_創建表時出現Django MySQL錯誤

我正在用MySQL數據庫構建一個django應用程序。當我第一次運行“python manage.py migrate”時,一些表創建得很好,然后出現一些錯誤。出現的錯誤是:django.db.utils.IntegrityError: (1215, Cannot add foreign keyconstraint)當我運行這個MyS…

Laravel數據庫遷移和填充(支持中文)

寫在前面 經常我們做項目都團隊協作開發,每個人都在自己本地的數據庫,如果你曾經出現過讓同事手動在數據庫結構中添加字段的情況,數據庫遷移可以解決你這個問題。 不僅如此,在線上部署的時候,也避免了手動導入數據庫或…

leetcode374. 猜數字大小(二分法)

猜數字游戲的規則如下: 每輪游戲,系統都會從 1 到 n 隨機選擇一個數字。 請你猜選出的是哪個數字。 如果你猜錯了,系統會告訴你這個數字比系統選出的數字是大了還是小了。 你可以通過調用一個預先定義好的接口 guess(int num) 來獲取猜測結果…

什么情況下你的工作最為成功_如何在沒有工作經驗的情況下獲得技術工作

什么情況下你的工作最為成功by Anthony Sistilli安東尼西斯蒂里(Anthony Sistilli) 如何在沒有工作經驗的情況下獲得技術工作 (How to get a tech job with no previous work experience) I run a free community called the Forge where I help students navigate the world …

jquery批量刪除

前臺代碼 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0">…

MUI 里js動態添加數字輸入框后,增加、減少按鈕無效

https://www.cnblogs.com/ssjf/p/10193652.html numbox 的自動初化是在 mui.ready 時完成的mui 頁面默認會自動初始化頁面中的所有數字輸入框&#xff0c;動態構造的 DOM 需要進行手動初始化。比如&#xff1a;您動態創建了一個 ID 為 abc 的數字輸入框&#xff0c;需要 mui(#a…

Django——認證系統(Day72)

閱讀目錄 COOKIE 與 SESSION 用戶認證 COOKIE 與 SESSION 概念 cookie不屬于http協議范圍&#xff0c;由于http協議無法保持狀態&#xff0c;但實際情況&#xff0c;我們卻又需要“保持狀態”&#xff0c;因此cookie就是在這樣一個場景下誕生。 cookie的工作原理是&#xff1a;…

description方法

1.description基本概念 NSLog("%", objectA);這會自動調用objectA的description方法來輸出ObjectA的描述信息. description方法默認返回對象的描述信息(默認實現是返回類名和對象的內存地址) description方法是基類NSObject 所帶的方法,因為其默認實現是返回類名和…

leetcode面試題 10.05. 稀疏數組搜索(二分法)

稀疏數組搜索。有個排好序的字符串數組&#xff0c;其中散布著一些空字符串&#xff0c;編寫一種方法&#xff0c;找出給定字符串的位置。 示例1: 輸入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,“dad”, “”, “”], s “ta” 輸出…

laravel框架制作縮略圖和水印

1.首先需要使用 composer 在命令行安裝最新版本的 intervention/image &#xff1a; composer require intervention/image2.注冊服務提供者及別名&#xff08;Laravel 版本 ≤ 5.4&#xff09; 如果你的 laravel 版本小于或等于 5.4&#xff0c;安裝后需要注冊服務提供者和別…

mysql 模糊查詢 tp框架_TP框架中模糊查詢實現

TP框架中模糊查詢實現$where[g.name] array(like,%.$groupname.%);表達式查詢上面的查詢條件僅僅是一個簡單的相等判斷&#xff0c;可以使用查詢表達式支持更多的SQL查詢語法&#xff0c;查詢表達式的使用格式&#xff1a;$map[字段1] array(表達式,查詢條件1);$map[字段2] ar…

肉體之愛的解釋圣經_可以解釋的AI簡介,以及我們為什么需要它

肉體之愛的解釋圣經by Patrick Ferris帕特里克費里斯(Patrick Ferris) 可以解釋的AI簡介&#xff0c;以及我們為什么需要它 (An introduction to explainable AI, and why we need it) Neural networks (and all of their subtypes) are increasingly being used to build pro…

Python可變與不可變類型及垃圾回收機制

1. 可變與不可變類型 1.1 可變類型 在id不變的情況下&#xff0c;value可以改變&#xff0c;則稱之為可變類型。列表、字典與集合是可變的。 l1 [1,2,3,4,5] print(id(l1)) l1[1] 520 #改變列表元素 print(id(l1)) result&#xff1a; 1700748379208 …

12-1 12 防盜鏈 訪問控制 php解析 代理

2019獨角獸企業重金招聘Python工程師標準>>> 12.13 Nginx防盜鏈 12.14 Nginx訪問控制 12.15 Nginx解析php相關配置 12.16 Nginx代理 擴展 502問題匯總 http://ask.apelearn.com/question/9109location優先級 http://blog.lishiming.net/?p10012.13 Nginx防盜鏈 用來…

leetcode911. 在線選舉(二分法)

在選舉中&#xff0c;第 i 張票是在時間為 times[i] 時投給 persons[i] 的。 現在&#xff0c;我們想要實現下面的查詢函數&#xff1a; TopVotedCandidate.q(int t) 將返回在 t 時刻主導選舉的候選人的編號。 在 t 時刻投出的選票也將被計入我們的查詢之中。在平局的情況下&…

1-13句子逆序

題目描述 將一個英文語句以單詞為單位逆序排放。例如“I am a boy”&#xff0c;逆序排放后為“boy a am I”所有單詞之間用一個空格隔開&#xff0c;語句中除了英文字母外&#xff0c;不再包含其他字符 接口說明 /** * 反轉句子 * * param sentence 原句子 * return 反轉后的…

單例模式實現DB類

創建一個類 class DB_class {//public $name andy;//私有的屬性private static $db;//公共的靜態方法public static function index(){if (self::$db ! null ){return self::$db;}self::$dbnew DB_class();return self::$db;}//私有的構造方法private function __construct()…

終端定時任務 開始緩沖_如何開始使用終端以提高生產力

終端定時任務 開始緩沖by Luciano Strika通過盧西亞諾斯特里卡(Luciano Strika) 如何開始使用終端以提高生產力 (How to start using the terminal to be more productive) As developers, the terminal can be our second home.作為開發人員&#xff0c;碼頭可以成為我們的第…

圖片預覽------photoswipe 使用

photoswipe 使用 預覽圖片后&#xff0c;需要點擊關閉按鈕才能關閉&#xff0c;點擊圖片事件效果是放大圖片&#xff0c;和微信的效果不一致&#xff0c;最后改用微信預覽圖片的接口了&#xff0c;但是例子可以用&#xff0c;記錄一下&#xff01;&#xff01; http://www.cnbl…

SSKeychain

Keychain 使用? ---為了實用最大化我覺得我應該直接先說使用&#xff01; 當然是使用第三方庫啦&#xff1a;sskeychain 3000星星的庫不開玩笑。github地址&#xff1a;https://github.com/soffes/sskeychain 導入完之后首先&#xff0c;編譯一下有無錯。 如果是自己手動導入&…