以下由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中文網其他相關文章!

Laravel是如何在後端邏輯中發揮作用的?它通過路由系統、EloquentORM、認證與授權、事件與監聽器以及性能優化來簡化和增強後端開發。 1.路由系統允許定義URL結構和請求處理邏輯。 2.EloquentORM簡化數據庫交互。 3.認證與授權系統便於用戶管理。 4.事件與監聽器實現松耦合代碼結構。 5.性能優化通過緩存和隊列提高應用效率。

Laravel受歡迎的原因包括其簡化開發過程、提供愉快的開發環境和豐富的功能。 1)它吸收了RubyonRails的設計理念,結合PHP的靈活性。 2)提供瞭如EloquentORM、Blade模板引擎等工具,提高開發效率。 3)其MVC架構和依賴注入機制使代碼更加模塊化和可測試。 4)提供了強大的調試工具和性能優化方法,如緩存系統和最佳實踐。

Django和Laravel都是全棧框架,Django適合Python開發者和復雜業務邏輯,Laravel適合PHP開發者和優雅語法。 1.Django基於Python,遵循“電池齊全”哲學,適合快速開發和高並發。 2.Laravel基於PHP,強調開發者體驗,適合小型到中型項目。

PHP和Laravel不是直接可比的,因為Laravel是基於PHP的框架。 1.PHP適合小型項目或快速原型開發,因其簡單直接。 2.Laravel適合大型項目或高效開發,因其提供豐富功能和工具,但學習曲線較陡,性能可能不如純PHP。

laravelisabackendframeworkbuiltonphp,設計ForweBapplicationDevelopment.itfocusessonserver-sideLogic,databasemagemention和Applicationstructure和CanBeintegratedWithFrontendTechnologiesLikeLikeVue.jsorreActeReacterVue.jsorreActforforfull-stackDevefloct。

本文討論了Laravel中的創建和使用自定義刀片指令以增強模板。它涵蓋了定義指令,在模板中使用它們,並在大型項目中管理它們,強調了改進的代碼可重複性和R等好處

本文討論了使用組件在Laravel中創建和自定義可重複使用的UI元素,從而為組織提供最佳實踐並建議增強包裝。

文章討論了使用Laravel的路由來創建SEO友好的URL,涵蓋最佳實踐,規範的URL和SEO優化工具。WordCount:159


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Dreamweaver Mac版
視覺化網頁開發工具

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