首頁 >php框架 >Laravel >詳解Laravel的生命週期

詳解Laravel的生命週期

藏色散人
藏色散人轉載
2020-07-27 13:20:176686瀏覽

以下由Laravel教學專欄為大家介紹Laravel的生命週期,希望對需要的朋友有幫助!

詳解Laravel的生命週期

Laravel的生命週期

#世間萬物皆有生命週期,當我們使用任何工具時都需要理解它的工作原理,那麼用起來就會得心應手,應用開發也是如此。理解了它的原理,那麼使用起來就會游刃有餘。
在了解 Laravel 的生命週期前,我們先回顧一下PHP 的生命週期。

PHP 的生命週期

PHP 的運行模式

PHP兩種運行模式是WEB模式、 CLI模式。

  1. 當我們在終端機敲入php這個指令的時候,使用的是CLI模式。
  2. 當使用Nginx或別web伺服器作為宿主處理一個到來的請求時,使用的是WEB模式。

生命週期

當我們請求一個php檔案時,PHP 為了完成這次請求,會發生5個階段的生命週期切換:

  1. 模組初始化(MINIT),即呼叫php.ini 中所指明的擴充功能的初始化函數進行初始化工作,如mysql 擴充。

  2. 請求初始化(RINIT),即初始化為執行本次腳本所需的變數名稱和變數值內容的符號表,如 $_SESSION變數。

  3. 執行該PHP腳本。

  4. 請求處理完成(Request Shutdown),依序呼叫各個模組的RSHUTDOWN 方法,對每個變數呼叫unset函數,如unset $_SESSION 變數。

  5. 關閉模組(Module Shutdown) , PHP呼叫每個擴充功能的 MSHUTDOWN 方法,這是各個模組最後一次釋放記憶體的機會。這意味著沒有下一個請求了。

WEB模式和CLI(命令列)模式很相似,差異是:

  1. CLI 模式會在每次腳本執行經歷完整的5個週期,因為你腳本執行完不會有下一個請求;
  2. WEB模式為了應對並發,可能採用多線程,因此生命週期15有可能只執行一次,下次請求到來時重複2-4的生命週期,這樣就節省了系統模組初始化所帶來的開銷。

可以看出PHP生命週期是很對稱的。說了這麼多,就是為了定位Laravel運行在哪裡,沒錯,Laravel僅運行再第三個階段:

詳解Laravel的生命週期

##PHP生命週期

作用

理解這些,你就可以優化你的

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自動載入所需的類別

  1. 檔案載入composer產生的自動載入設置,包括所有你

    composer require的依賴。

  2. 產生容器Container,Application實例,並向容器註冊核心元件(HttpKernel,ConsoleKernel ,ExceptionHandler)(對應程式碼2,容器很重要,後面詳細講解)。

  3. 處理請求,產生並發送回應(對應程式碼3,毫不誇張的說,你99%的程式碼都運行在這個小小的handle 方法裡面)。

  4. 请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。

Laravel 的请求步骤

Laravel 的请求步骤

我们不妨在详细一点:

第一步:注册加载composer自动生成的class loader

就是加载初始化第三方依赖。

第二步:生成容器 Container

并向容器注册核心组件,是从 bootstrap/app.php 脚本获取 Laravel 应用实例,

第三步:这一步是重点,处理请求,并生成发送响应。

请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。

取决于是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。

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 先于ServiceProvidersFacades也是重点,后面说,这里简单提一下,注册 Facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如AuthCache,DB等等都是Facades;而ServiceProvidersregister方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。

HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。

HTTP 内核的标志性方法 handle处理的逻辑相当简单:获取一个 Request,返回一个 Response,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。

第四步:将请求传递给路由。

在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。

传递给路由是通过 Pipeline(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php中的$middleware数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。

 

然后遍历所有注册的路由,找到最先符合的第一个路由,经过它的路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。

所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。

詳解Laravel的生命週期

詳解Laravel的生命週期

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

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除