#30 Laravel基礎

デプロイとパフォーマンスチューニング

本番デプロイの基本手順

ローカルで開発したアプリを本番サーバーに展開する一連の手順です。


デプロイ時のコマンド

定番のデプロイスクリプト

# ① コードを取得
git pull origin main

# ② 依存関係を更新(devパッケージを除く)
composer install --optimize-autoloader --no-dev

# ③ フロントエンドのビルド
npm ci && npm run build

# ④ DBマイグレーション(--force で本番でも実行)
php artisan migrate --force

# ⑤ 各種キャッシュを再生成
php artisan config:cache    # 設定キャッシュ
php artisan route:cache     # ルートキャッシュ
php artisan view:cache      # ビューキャッシュ
php artisan event:cache     # イベントキャッシュ(Laravel 10以降)

# ⑥ キューワーカーを再起動
php artisan queue:restart

メンテナンスモード

デプロイ中は503ページを表示してユーザーへの影響を最小化できます。

# メンテナンスモードを開始
php artisan down --render="errors.503" --retry=60

# デプロイ処理...

# メンテナンスモードを終了
php artisan up

--secret=token を付けると、特定のURLからはメンテナンス中でもアクセスできます。


.env の本番設定

# 📁 .env(本番環境)

APP_ENV=production
APP_DEBUG=false  # ← 必ず false にする(エラー内容をユーザーに見せない)
APP_URL=https://example.com

# ← 本番用のメール・DB・キャッシュ設定を記述

キャッシュによる高速化

設定キャッシュ

php artisan config:cache

config/*.php の全設定を1つのファイルにまとめてキャッシュします。リクエストごとに設定ファイルを読み込む処理がなくなります。

ルートキャッシュ

php artisan route:cache

ルート定義をシリアライズしてキャッシュします。ルートが多いアプリで効果的です。

クラスオートローダーの最適化

composer install --optimize-autoloader

Composerのクラスマップを最適化して、ファイルの自動読み込みを高速化します。


データベースパフォーマンスのチューニング

インデックスの確認

よく検索・ソートするカラムにはインデックスが必要です。

// スロークエリを記録する(開発時)
// 📁 app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\DB;

public function boot(): void
{
    if (config('app.debug')) {
        DB::listen(function ($query) {
            if ($query->time > 100) { // 100ms以上かかったクエリをログに残す
                \Log::warning("スロークエリ: {$query->sql} ({$query->time}ms)");
            }
        });
    }
}

Eloquentの最適化ポイント

// ❌ N+1問題(必ず修正する)
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->user->name; // ← ループごとにSQLが走る
}

// ✅ Eagerロードで解決
$posts = Post::with('user')->get();

// ❌ 全カラム取得(必要なカラムだけにする)
$posts = Post::all();

// ✅ 必要なカラムだけ取得
$posts = Post::select('id', 'title', 'user_id', 'created_at')->get();

デバッグバーの活用

開発環境では barryvdh/laravel-debugbar を使うとSQL数・実行時間・メモリ使用量をブラウザで確認できます。

composer require barryvdh/laravel-debugbar --dev

ストレージのシンボリックリンク

php artisan storage:link

本番サーバーでも必ず実行してください。


キューワーカーを常時起動する(Supervisor)

本番では Supervisor でキューワーカーを常時起動します。

# /etc/supervisor/conf.d/laravel-worker.conf

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
numprocs=4
user=www-data
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log

まとめ

デプロイ時のチェックリスト:

  • APP_DEBUG=false になっているか
  • APP_ENV=production になっているか
  • php artisan migrate --force を実行したか
  • config:cache, route:cache, view:cache を実行したか
  • composer install --optimize-autoloader --no-dev を実行したか
  • php artisan storage:link を実行したか
  • php artisan queue:restart でワーカーを再起動したか

このシリーズを終えて

30回にわたるLaravel基礎シリーズを終了します。

このシリーズでカバーした主な内容:

分野
ルーティング・コントローラー1〜3
DI・Blade4〜5
Eloquent(リレーション・スコープ・ソフトデリート)6〜10
マイグレーション・ファクトリー・トランザクション11〜13
ページネーション・認証・認可14〜16
ファイル・設定・キャッシュ17〜19
メール・キュー・通知20〜22
API認証・イベント・コマンド23〜25
CSV・テスト・Collection26〜29
デプロイ30

実務では「どう組み合わせるか」が重要です。ぜひ自分のアプリを作りながら定着させてください。