目錄
PHP 的生命週期
#PHP運行模式
首先 Bootstrap 检测环境,加载 bootstrapper数组中的一些配置
第一堵墙,全局中间件,默认为 CheckForMaintenanceMode
然后遍历所有注册的路由,找到最先符合的第一个路由
第二堵墙,通过该路由的中间件(组)
首頁 php框架 Laravel 初步了解Laravel中的生命週期

初步了解Laravel中的生命週期

Sep 07, 2021 pm 07:49 PM
laravel php 生命週期

以下由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 程式碼,可以更深入的了解Laravel 的singleton(單例)。至少你知道了,每一次請求結束,PHP 的變數都會unset,Laravel 的singleton 只是在某一次請求過程中的singleton;你在Laravel 中的靜態變數也不能在多個請求之間共享,因為每一次請求結束都會unset。理解這些概念,是寫出高品質程式碼的第一步,也是最關鍵的一步。因此記住,PHP是一種腳本語言,所有的變數只會在這次請求中生效,下次請求時已被重置,而不像Java靜態變數擁有全域作用。

Laravel 的生命週期

概述

#Laravel 的生命週期從public\index.php開始,從public\ index.php結束。

初步了解Laravel中的生命週期以下是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,還記得可終止中間件嗎?沒錯,就是在這裡回呼的)。

初步了解Laravel中的生命週期我們不妨在詳細一點:

第一步:註冊載入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隔离在外。

初步了解Laravel中的生命週期

原文地址:https://juejin.cn/post/6992208648575385607

作者:卡二条

相关推荐:最新的五个Laravel视频教程

以上是初步了解Laravel中的生命週期的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

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)

進行音頻/視頻處理 進行音頻/視頻處理 Jul 20, 2025 am 04:14 AM

音視頻處理的核心在於理解基本流程與優化方法。 1.其基本流程包括採集、編碼、傳輸、解碼和播放,每個環節均有技術難點;2.常見問題如音畫不同步、卡頓延遲、聲音噪音、畫面模糊等,可通過同步調整、編碼優化、降噪模塊、參數調節等方式解決;3.推薦使用FFmpeg、OpenCV、WebRTC、GStreamer等工具實現功能;4.性能管理方面應注重硬件加速、合理設置分辨率幀率、控制並發及內存洩漏問題。掌握這些關鍵點有助於提升開發效率和用戶體驗。

使用Laravel中的樞軸表多次關係。 使用Laravel中的樞軸表多次關係。 Jul 20, 2025 am 01:37 AM

Howdoyouhandlemany-to-ManyReationsInlaravelSifusingspivottables? 1.CreateApivottableFollowingLaravelLavel'SnamingConvention(AlphabientyOrderOrdoreFthetWoreLealatedTables,例如coles_user).2.2.2.2.2.defineForeignKeys(e.g. defineForeignkeys)

使用翻譯員立面在Laravel中進行定位。 使用翻譯員立面在Laravel中進行定位。 Jul 21, 2025 am 01:06 AM

thetranslatorfacadeinlaravelisused forlocalization byfetchingTranslatingStringSandSwitchingLanguagesAtruntime.Touseit,storetranslationslationstringsinlanguagefilesunderthelangderthelangdirectory(例如,ES,ES,FR),thenretreiveTreivEthemvialang :: thenretRievEtheMvialang :: get()

將參數傳遞給Laravel中的中間件。 將參數傳遞給Laravel中的中間件。 Jul 20, 2025 am 03:58 AM

TopassparameterstomiddlewareinLaravel,definethemdirectlyintheroutemiddlewarestringandcapturetheminthemiddleware’shandlemethodusingvariable-lengthargumentlists.Forexample,Route::get('/profile',ProfileController::class)->middleware('role:admin,edito

使用Laravel的內置' str”助手。 使用Laravel的內置' str”助手。 Jul 19, 2025 am 02:40 AM

Laravel’sStrhelpersimplifiesstringmanipulationwithafluentAPIandreusablemethods.1.Itcleansandformatsstringsviatrim,lower,upper,andtitlemethods.2.Itextractspartsofstringsusingbefore,after,substr,limit,andreplace.3.ItgeneratesSEO-friendlyslugswithslug,k

如何在Laravel中播種數據庫。 如何在Laravel中播種數據庫。 Jul 19, 2025 am 03:28 AM

數據庫播種(Seeding)在Laravel中用於快速填充測試或初始數據,通過seeder類與modelfactory結合Faker可高效生成結構化數據。 1.使用phpartisanmake:seeder創建seeder類並在run()方法中插入數據;2.推薦使用Eloquent的create()或批量insert()方法操作數據;3.利用phpartisanmake:factory創建工廠類並通過Faker生成動態測試數據;4.在主DatabaseSeeder.php文件中調用其他seeder

'composer.json'文件在Laravel項目中的作用是什麼? 'composer.json'文件在Laravel項目中的作用是什麼? Jul 20, 2025 am 03:17 AM

composer.json在Laravel項目中至關重要,其核心作用包括定義依賴、配置自動加載和自定義腳本鉤子。 ①它通過"require"部分列出項目所需包及其版本,確保依賴一致性;②通過"autoload"部分按PSR-4標準映射命名空間與目錄,實現類的自動加載;③通過"scripts"部分定義Composer操作前後的自定義腳本,自動化任務流程,提升開發效率。

在Laravel中實現存儲庫模式。 在Laravel中實現存儲庫模式。 Jul 20, 2025 am 03:59 AM

在Laravel中實現Repository模式的目的是解耦業務邏輯與數據訪問層,提升代碼可維護性與擴展性。 1.創建Interface和具體實現類;2.通過ServiceProvider綁定接口到實現類;3.在Controller中依賴注入接口並調用方法。以app/Repositories目錄存放UserRepositoryInterface與EloquentUserRepository示例,通過bind方法註冊綁定,並在UserController中使用依賴注入訪問用戶數據。該模式適用於多數據源

See all articles