🦔

Laravelのライフサイクル入門

に公開

はじめに

Laravelを触って一年ほど経った。
いつもなんとなく使って動いているが、そもそもの仕組みについて理解してみたいと思った。
Laravelのライフサイクルについて調べてみた。

tl;dr

LaravelなどのPHPアプリは基本的にリクエストごとにアプリが起動して処理し、レスポンスを返したら終了する(状態は基本的に引き継がれない)。
サーバーが動いている間、Laravelアプリ自体がメモリ上に常駐していると思い込んでいた。
(一方で Node.js や Java、Python などは、常駐プロセスで複数リクエストを捌くモデルが一般的。)

ライフサイクルの概要:
Webサーバー → public/index.php → (autoload / app生成) → HTTP Kernel → ミドルウェア → ルーティング → コントローラ → Response → send → terminate

ライフサイクルの概要

LaravelのHTTPリクエスト処理は、ざっくり言うと「Webサーバーが public/index.php に処理を渡し、Laravelがレスポンスを作って返す」流れ。

ポイントは ルーティングやコントローラ実行は public/index.php から始まり、内部では HTTP Kernel が中心になって処理が進むこと。そして **ブラウザに返す"出力"自体は Response->send()(index.php側)**が担う。

処理の流れ

  1. Webサーバー(Nginx/Apache)がリクエストを受け取り、内部リライトpublic/index.php に渡す
  2. public/index.php が Composer のオートローダーを読み込む(以降 require なしでクラスが使える)
  3. bootstrap/app.php でアプリ(Application)のインスタンスを生成する
  4. LaravelのHTTP Kernelにリクエスト処理を任せる
    • 内部では ミドルウェア → ルーティング → コントローラ の順に進み Response が生成される
  5. Response->send() でレスポンスを出力し、Webサーバー経由でブラウザに返る
  6. 最後に terminate() などの後処理をして終了する
index.php
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

define('LARAVEL_START', microtime(true));

// 1. オートローダーを読み込む
require __DIR__.'/../vendor/autoload.php';

// 2. アプリ(Application)のインスタンスを生成
$app = require_once __DIR__.'/../bootstrap/app.php';

// 3. カーネルにリクエストを渡す
$kernel = $app->make(Kernel::class);

$request = Request::capture();
$response = $kernel->handle($request);

// 4. レスポンスを出力
$response->send();

// 5. 後処理
$kernel->terminate($request, $response);

1. オートローダーを読み込む

vendor/autoload.php は Composer が生成するオートローダーの入口。
これを読み込むことで、Laravel本体・依存パッケージ・自分のアプリのクラスを requireせずに参照できるようになる

2. アプリ(Application)のインスタンスを生成

bootstrap/app.phpApplication インスタンスを生成して返す。
以降、HTTP Kernel や Router などの主要コンポーネントは、この $app から解決(生成)されてリクエスト処理が進む。
これはサービスコンテナが担う。それについては次回深掘りして説明したい。

3. カーネルにリクエストを渡す

$kernel->handle($request) が、実際のHTTPリクエスト処理の本体。
ミドルウェアのチェーンを通り、ルーティングによって該当のコントローラが呼ばれ、Response が返却される。
普段私たちが書くことの多い、コントローラやDB操作のロジックは、この部分で実行されている。

4. レスポンスを出力

$response->send() で、生成された Response を実際のHTTPレスポンスとして出力する。
ここでヘッダやボディがPHPから出力され、Webサーバー(Nginx/Apache)経由でブラウザへ返る。

5. 後処理(terminate)

レスポンスを返したあとに、$kernel->terminate($request, $response) が呼ばれる。
ここでは terminate 可能なミドルウェアなどの後片付けが実行される。
例えばセッション書き戻しやログ出力を行うミドルウェアがここで動く。

Discussion