ホームページ  >  記事  >  PHPフレームワーク  >  Laravel のライフサイクルについての予備的な理解

Laravel のライフサイクルについての予備的な理解

青灯夜游
青灯夜游転載
2021-09-07 19:49:272262ブラウズ

Laravel のチュートリアルコラムでは、Laravel のライフサイクルを予備的に理解することができますので、困っている友人のお役に立てれば幸いです。

Laravel のライフサイクルについての予備的な理解

PHP のライフサイクル

PHP 実行モード

2 種類の PHP実行モードには、WEB モードと CLI モードがあります。

  • ターミナルに php コマンドを入力するときは、CLI モードを使用します。

  • Nginx または別の Web サーバーをホストとして使用して受信リクエストを処理する場合、WEB モードが使用されます。

ライフ サイクル

php ファイルをリクエストすると、PHP はリクエストを完了するために 5 段階のライフ サイクル切り替えを実行します。

モジュール初期化 (MINIT)。つまり、php.ini で指定された拡張初期化関数を呼び出して、mysql 拡張機能などの初期化作業を実行します。

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

PHP スクリプトを実行します。

リクエスト処理完了(Request Shutdown)後、各モジュールのRSHUTDOWNメソッドを順番に呼び出し、各変数のunset関数(unset $_SESSION変数など)を呼び出します。

モジュールを閉じるとき (モジュール シャットダウン)、PHP は各拡張機能の MSHUTDOWN メソッドを呼び出します。これが各モジュールがメモリを解放する最後の機会です。これは、次のリクエストがないことを意味します。

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

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

Laravel のライフサイクルについての予備的な理解

Function

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

Laravel のライフサイクル

概要

Laravel のライフサイクルは、public\index.php から始まり、public\index で終わります。 .php が終了します。

Laravel のライフサイクルについての予備的な理解

以下は public\index.php のソース コード全体です。より具体的には、4 つのステップに分けることができます。 4 つのステップの詳細な説明。はい: Composer は、必要なクラス

ファイルを自動的にロードして、コンポーザが必要とするすべての依存関係を含む、コンポーザによって生成された自動ロード設定をロードします。

コンテナ Container、Application インスタンスを生成し、コア コンポーネント (HttpKernel、ConsoleKernel、ExceptionHandler) をコンテナに登録します (コード 2 に対応します。コンテナは非常に重要です。詳しくは後で説明します)。

リクエストを処理し、レスポンスを生成して送信します (コード 3 に相当します。コードの 99% がこの小さなハンドル メソッドで実行されると言っても過言ではありません)。

リクエストが終了し、コールバックが実行されます (コード 4 に相当します。終了するミドルウェアを覚えていますか? はい、ここでコールバックされます)。

さらに詳しく説明します: Laravel のライフサイクルについての予備的な理解

ステップ 1: Composer によって自動的に生成されたクラス ローダーを登録してロードします。 サードパーティの依存関係をロードして初期化します。

ステップ 2: コンテナーの生成 コンテナー コアコンポーネントをコンテナに登録するには、bootstrap/app.php スクリプトから Laravel アプリケーションインスタンスを取得します。

3 番目のステップ: このステップが中心で、リクエストを処理し、レスポンスを生成します。 リクエストは、アプリケーションに受信されるリクエストのタイプに応じて、HTTP コアまたはコンソール コアに送信されます。

リクエストがブラウザ経由かコンソール経由かによって異なります。ここでは主にブラウザ経由でリクエストします。 HTTP カーネルの象徴的なメソッドであるハンドル処理のロジックは非常に単純です。リクエストを取得し、レスポンスを返します。カーネルをアプリケーション全体を表す大きなブラック ボックスとして想像し、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 中国語 Web サイトの他の関連記事を参照してください。

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