首頁  >  文章  >  php框架  >  初步了解Laravel中的生命週期

初步了解Laravel中的生命週期

青灯夜游
青灯夜游轉載
2021-09-07 19:49:272264瀏覽

以下由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刪除