初步了解Laravel中的生命週期
以下由Laravel教學專欄帶大家初步了解Laravel中的生命週期,希望對需要的朋友有幫助!
PHP 的生命週期
#PHP運行模式
##PHP兩種運行模式是WEB模式、CLI模式。- 當我們在終端機敲入php這個指令的時候,使用的是CLI模式。
- 當使用Nginx或別web伺服器作為宿主處理一個到來的請求時,使用的是WEB模式。
生命週期
當我們請求一個php檔案時,PHP 為了完成這次請求,會發生5個階段的生命週期切換:模組初始化(MINIT),即呼叫php.ini 中指明的擴充功能的初始化函數進行初始化工作,如mysql 擴充。 請求初始化(RINIT),即初始化為執行本次腳本所需的變數名稱和變數值內容的符號表,如 $_SESSION變數。 執行該PHP腳本。 請求處理完成(Request Shutdown),依序呼叫各個模組的 RSHUTDOWN 方法,對每個變數呼叫 unset函數,如 unset $_SESSION 變數。 關閉模組(Module Shutdown) , PHP呼叫每個擴充的 MSHUTDOWN 方法,這是各個模組最後一次釋放記憶體的機會。這意味著沒有下一個請求了。 WEB模式和CLI(命令列)模式很相似,差異是:CLI 模式會在每次腳本執行經歷完整的5個週期,因為你腳本執行完不會有下一個請求; WEB模式為了應對並發,可能採用多線程,因此生命週期1和5有可能只執行一次,下次請求到來時重複2-4的生命週期,這樣就節省了系統模組初始化所帶來的開銷。 可以看出PHP生命週期是很對稱的。說了這麼多,就是為了定位Laravel運行在哪裡,沒錯,Laravel僅僅運行再第三個階段:理解這些,你就可以優化你的Laravel 程式碼,可以更深入的了解Laravel 的singleton(單例)。至少你知道了,每一次請求結束,PHP 的變數都會unset,Laravel 的singleton 只是在某一次請求過程中的singleton;你在Laravel 中的靜態變數也不能在多個請求之間共享,因為每一次請求結束都會unset。理解這些概念,是寫出高品質程式碼的第一步,也是最關鍵的一步。因此記住,PHP是一種腳本語言,所有的變數只會在這次請求中生效,下次請求時已被重置,而不像Java靜態變數擁有全域作用。
Laravel 的生命週期概述
#Laravel 的生命週期從public\index.php開始,從public\ index.php結束。
以下是public\index.php的全部原始碼,更具體來說可以分為四個步驟:
1. require __DIR__.'/../bootstrap/autoload.php'; 2. $app = require_once __DIR__.'/../bootstrap/app.php'; $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 3. $response = $kernel->handle( $request = Illuminate\Http\Request::capture() ); $response->send(); 4. $kernel->terminate($request, $response);
以下是四步驟詳細的解釋是: composer自動載入需要的類別
檔案載入composer產生的自動載入設置,包括所有你 composer require的依賴。
產生容器Container,Application實例,並向容器註冊核心元件(HttpKernel,ConsoleKernel ,ExceptionHandler)(對應程式碼2,容器很重要,後面詳細講解)。
處理請求,產生並發送回應(對應程式碼3,毫不誇張的說,你99%的程式碼都運行在這個小小的handle 方法裡面)。
請求結束,進行回呼(對應程式碼4,還記得可終止中間件嗎?沒錯,就是在這裡回呼的)。
我們不妨在詳細一點:
第一步:註冊載入composer自動產生的class loader 就是載入初始化第三方依賴。
第二步:產生容器 Container 並向容器註冊核心元件,是從 bootstrap/app.php 腳本取得 Laravel 應用實例,
#第三步:這一步是重點,處理請求,並產生發送回應。 請求被傳送到 HTTP 內核或 Console 內核,這取決於進入應用程式的請求類型。
取決於是透過瀏覽器請求還是透過控制台請求。這裡我們主要是透過瀏覽器請求。 HTTP 核心的標誌性方法 handle處理的邏輯相當簡單:取得一個 Request,傳回一個 Response,把該核心想像作一個代表整個應用程式的大黑盒子,輸入 HTTP 請求,回傳 HTTP 回應。首先 Bootstrap 检测环境,加载 bootstrapper数组中的一些配置
HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。
protected $bootstrappers = [ //注册系统环境配置 (.env) 'Illuminate\Foundation\Bootstrap\DetectEnvironment', //注册系统配置(config) 'Illuminate\Foundation\Bootstrap\LoadConfiguration', //注册日志配置 'Illuminate\Foundation\Bootstrap\ConfigureLogging', //注册异常处理 'Illuminate\Foundation\Bootstrap\HandleExceptions', //注册服务容器的门面,Facade 是个提供从容器访问对象的类。 'Illuminate\Foundation\Bootstrap\RegisterFacades', //注册服务提供者 'Illuminate\Foundation\Bootstrap\RegisterProviders', //注册服务提供者 `boot` 'Illuminate\Foundation\Bootstrap\BootProviders', ];
注意顺序:
Facades 先于ServiceProviders,Facades也是重点,后面说,这里简单提一下,注册 Facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如Auth,Cache,DB等等都是Facades;而ServiceProviders的register方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。
第一堵墙,全局中间件,默认为 CheckForMaintenanceMode
在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
传递方式: 传递给路由是通过 Pipeline(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php中的$middleware数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。
然后遍历所有注册的路由,找到最先符合的第一个路由
然后遍历所有注册的路由,找到最先符合的第一个路由,
第二堵墙,通过该路由的中间件(组)
经过该路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。
所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。
原文地址:https://juejin.cn/post/6992208648575385607
作者:卡二条
相关推荐:最新的五个Laravel视频教程
以上是初步了解Laravel中的生命週期的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

熱門話題

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

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

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

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

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

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

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

Laravel計劃任務運行無響應排查在使用Laravel的計劃任務調度時,不少開發者會遇到這樣的問題:schedule:run...
