章: 第4章: Laravelフレームワーク
メール送信や画像処理をリクエスト内で動かして、レスポンスが遅くなっていませんか?
ユーザーが「送信」を押してから数秒待たされるのは、UXを大きく損ないます。Laravelのキュー・ジョブを使えば、重い処理をバックグラウンドに追い出し、レスポンスを即時返せます。
キューを使わずに重い処理を同期実行すると何が起きるか
メール送信APIの応答待ちやPDF生成のCPU処理がリクエストをブロックし、タイムアウトやサーバー負荷増大につながります。ジョブクラスに切り出してキューに投入するだけで、これらの問題を構造的に解消できます。
キュー実装の良い例・悪い例
| 観点 | 悪い例 | 良い例 |
| メール送信 | コントローラで Mail::send() を同期実行 |
SendWelcomeMail::dispatch() でキュー投入 |
| 失敗対応 | 失敗しても気づかない | $tries / $backoff でリトライ設定 |
| 監視 | ワーカーのステータス不明 | Laravel HorizonでQueue監視 |
| ドライバ | sync(デフォルト)のまま本番使用 |
本番では redis または sqs を使う |
チェックポイント:
queue:workは一度起動しただけではコードの変更を自動反映しません。デプロイ後はphp artisan queue:restartを実行し、ワーカーを再起動しましょう。本番ではSupervisorやLaravel Octaneでワーカーを常時起動させます。
コードサンプル
<?php
// php artisan make:job SendWelcomeMail
class SendWelcomeMail implements ShouldQueue {
use Dispatchable, Queueable;
public function __construct(private User $user) {}
public function handle(): void {
Mail::to($this->user->email)->send(new WelcomeMail($this->user));
}
}
// ジョブを投入
SendWelcomeMail::dispatch($user);
// ワーカー起動: php artisan queue:work
まとめ & 次のステップ
- キューを使うとメール・通知・重い計算処理をバックグラウンドに追い出せます
ShouldQueueを実装するだけで既存のジョブをキューに対応させられます- 失敗時のリトライ回数とバックオフ時間を
$tries/$backoffで設定しましょう - 開発時は
QUEUE_CONNECTION=syncでキューを使わずに動作確認できます - デプロイ後は必ず
queue:restartでワーカーを再起動してください
次回は イベントとリスナ を学びます。「何かが起きたら別の処理を動かす」疎結合な設計を整理しましょう。