ホームページ  >  記事  >  PHPフレームワーク  >  Laravelのライフサイクルを詳しく解説

Laravelのライフサイクルを詳しく解説

藏色散人
藏色散人転載
2020-07-27 13:20:176626ブラウズ

以下は、#Laravel のチュートリアルコラムで、Laravel のライフサイクルを紹介します。

Laravelのライフサイクルを詳しく解説

Laravel のライフサイクル

世の中のすべてのものにはライフサイクルがあり、それを理解する必要があります。あらゆるツールを使用する 機能すれば使いやすくなります。これはアプリケーション開発にも当てはまります。原理を理解すれば、簡単に使用できるようになります。

Laravel のライフサイクルを理解する前に、まず PHP のライフサイクルを確認しましょう。

PHP のライフサイクル

PHP の動作モード

PHP の 2 つの動作モードは WEB モードです、CLI モード。

    ターミナルに php コマンドを入力するときは、CLI モードを使用します。
  1. Nginx または別の Web サーバーをホストとして使用して受信リクエストを処理する場合、WEB モードが使用されます。

ライフ サイクル

php ファイルをリクエストすると、PHP はリクエストを完了するために 5 つの段階を経ます。スイッチング:

  1. モジュール初期化 (MINIT)。つまり、

    php.ini で指定された拡張初期化関数を呼び出して、mysql などの初期化作業を実行します。 # ## 拡大。

  2. 初期化 (RINIT) を要求します。つまり、
  3. $_SESSION

    変数など、このスクリプトの実行に必要な変数名と変数値の内容を使用してシンボル テーブルを初期化します。

  4. PHP スクリプトを実行します。
  5. リクエスト処理完了(リクエストシャットダウン)後、各モジュールの
  6. RSHUTDOWN

    メソッドを順番に呼び出し、unset 関数を呼び出します。 unset $_SESSION 変数など、変数ごとに。

  7. モジュールを閉じる (モジュール シャットダウン)、PHP は各拡張機能の
  8. MSHUTDOWN

    メソッドを呼び出します。これは、各モジュールがメモリを解放する最後の機会です。これは、次のリクエストがないことを意味します。

  9. WEB モードは CLI (コマンド ライン) モードとよく似ていますが、異なる点は次のとおりです:

CLI モードは、実行するたびに 5 サイクル完了します。スクリプトが実行されます。スクリプトの実行後に次のリクエストがないため、
  1. WEB モードでは同時実行性に対処するためにマルチスレッドを使用する可能性があるため、ライフサイクル
  2. 1
  3. および 5 が可能です。一度だけ実行され、次のリクエストが来たときに 2-4 のライフサイクルが繰り返されるため、システム モジュールの初期化によって生じるオーバーヘッドが節約されます。
  4. PHP のライフサイクルは非常に対称的であることがわかります。はい、Laravel は第 3 段階でのみ実行されます:

Laravelのライフサイクルを詳しく解説
PHP ライフ サイクル

Function

これらを理解すると、

Laravel

コードを最適化し、Laravel の singleton (シングル ケース) をより深く理解できるようになります。少なくとも、各リクエストの終了時に PHP の変数は unset になり、Laravel の singleton は特定のリクエスト中のみ singleton になることがわかっています。 Laravel の静的変数は、各リクエストが最後に unset になるため、複数のリクエスト間で共有することはできません。これらの概念を理解することは、高品質のコードを作成するための最初で最も重要なステップです。したがって、グローバルな効果を持つ Java 静的変数とは異なり、PHP はスクリプト言語であり、すべての変数はこのリクエストでのみ有効になり、次のリクエストでリセットされることに注意してください。

Laravel のライフサイクル

概要

Laravel のライフサイクルは

public\index.php

から始まりますpublic\index.php で始まり、終わります。

Laravelのライフサイクルを詳しく解説
リクエスト プロセス

以下は、

public\index.php

の完全なソース コードです。分割できます。 4 つのステップに分けます: <pre class="brush:php;toolbar:false;">1. require __DIR__.&amp;#39;/../bootstrap/autoload.php&amp;#39;; 2. $app = require_once __DIR__.&amp;#39;/../bootstrap/app.php&amp;#39;; $kernel = $app-&gt;make(Illuminate\Contracts\Http\Kernel::class); 3. $response = $kernel-&gt;handle( $request = Illuminate\Http\Request::capture() ); $response-&gt;send(); 4. $kernel-&gt;terminate($request, $response);</pre>以下は 4 つのステップの詳細な説明です:

composer は必要なクラスを自動的にロードします。


    ファイルは自動ロード ファイルをロードします。 Composer によって生成された設定には、すべての
  1. composer require

    依存関係が含まれます。

  2. コンテナ コンテナ、アプリケーション インスタンスを生成し、コア コンポーネント (HttpKernel、ConsoleKernel、ExceptionHandler) をコンテナに登録します (コード 2 に対応します。コンテナは非常に重要であり、で説明します)詳細は後ほど)。
  3. リクエストを処理し、レスポンスを生成して送信します (コード 3 に相当します。コードの 99% がこの小さなハンドル メソッドで実行されると言っても過言ではありません)。
  4. 请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。

Laravel 的请求步骤

Laravel 的请求步骤

我们不妨在详细一点:

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

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

第二步:生成容器 Container

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

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

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

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

HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。

protected $bootstrappers = [
        //注册系统环境配置 (.env)
        &#39;Illuminate\Foundation\Bootstrap\DetectEnvironment&#39;,
        //注册系统配置(config)
        &#39;Illuminate\Foundation\Bootstrap\LoadConfiguration&#39;,
        //注册日志配置
        &#39;Illuminate\Foundation\Bootstrap\ConfigureLogging&#39;,
        //注册异常处理
        &#39;Illuminate\Foundation\Bootstrap\HandleExceptions&#39;,
        //注册服务容器的门面,Facade 是个提供从容器访问对象的类。
        &#39;Illuminate\Foundation\Bootstrap\RegisterFacades&#39;,
        //注册服务提供者
        &#39;Illuminate\Foundation\Bootstrap\RegisterProviders&#39;,
        //注册服务提供者 `boot`
        &#39;Illuminate\Foundation\Bootstrap\BootProviders&#39;,
    ];

注意顺序:
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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。