# Laravel Queue で非同期処理

Laravel Queue を利用することは、一括登録など重い処理に対処する優れた方法です。Laravel で作業することがあったので資料まとめました。

なぜ非同期は必要

Queue を使用することで、ユーザーは待たずにアプリケーションを使用できます。長時間かかる処理もバックグラウンドで実行し、処理が非同期に行われ、ユーザーエクスペリエンスが向上します。

# Queue で非同期処理のメリット

  • ジョブの分割
    大きなタスクを適切な単位で分割することで、並列処理を活用しやすくなり、タスク処理のパフォーマンスが向上します。

  • エラーハンドリング
    ジョブの実行中に発生するエラーに対処するための適切なエラーハンドリングができます。エラーが発生した場合、それに対する通知やログを残すことで、問題の追跡や修正が容易になります。

  • ジョブの優先順位
    特定のジョブが他のジョブよりも優先的に処理されるべき場合、その優先順位を適切に設定することができます。

  • スケーラビリティ
    適切な Queue ドライバーやバックエンドを選択することでシステムが成長してもスケーラブルな Queue 処理ができます。

  • ワーカーの管理
    ワーカーの数やプロセスの管理に、リソースを最適に活用することができます。

  • モニタリングとメトリクス
    Queue の実行状況や遅延、エラーなどをモニタリングし、必要に応じて適切な対策を取ることができます。

# データベースキュードライバを指定

QUEUE_CONNECTION=database

# マイグレーションの作成

キューのジョブをデータベースに格納するためのマイグレーションを作成します。

php artisan queue:table
php artisan migrate

# ジョブの作成

php artisan make:job ImportCsv

ImportCsv ジョブの handle メソッド内に、CSV の処理ロジックを追加

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Artisan;

class GenerateExamImages implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $csvFile;
    public function __construct($file)
    {
        $this->csvFile = $file;
    }

    public function handle()
    {
        $this->csvImport($this->csvFile);
    }
}

# Controller の作成

php artisan make:controller CsvController

ImportCsv ジョブをディスパッチ

public function uploadCsv(Request $request)
{
    $csvFile = $request->file('csv');

    ImportCsv::dispatch($csvFile);

}

# Supervisor の作成

Laravel のキュー処理をほぼ永久的に動かす方法

[program:laravel-worker]
user=root
process_name=%(program_name)s_%(process_num)02d
command=/usr/bin/php /var/www/html/artisan queue:work --tries=3
autostart=true
autorestart=true
numprocs=2
stdout_logfile=/dev/stdout
2023-11-23
  • laravel

関連記事

Laravel メンテナンスモード
Laravel model で hidden に設定したカラムを一時解除
Laravel でカテゴリー作成 テーブル構築と再帰クエリ
Laravel notification メール通知カスタマイズ
Laravel lang バリデーションメッセージを多言語対応
Laravel を API サーバーとしての初期設定
Laravel リクエストログ出力
Laravel 429 Too Many Requests
Laravel Email バリデーションについて
Laravel Sanctum 使って API トークン JWT 認証と SPA 認証
AWS SES メール開封確認  DB に集計
Laravel logger でエラーログを chatwork に自動送信
Laravel tinker 使って DB データベース接続とコマンド
Laravel Test についてのメモ
Laravel Log の基本設定&使い方
Laravel Sail で Docker 環境構築
Laravel Lumen Faker 日本語設定
laravel method の基本 get post put options
Laravel schedule 設定
Laravel eloquent model の規約
Laravel timestamp() auto update 有効化無効化
Laravel toSql パラメータ付きで出力
Laravel blade foreach loop と current url
laravel session を制する
Laravel 5.1 から 8.1 にバージョンアップ
Lumen と Laravel 違い比較
Laravel Error についてのメモ
laravel に vuejs 使うための初期設定