【Laravel】Queueで非同期処理を実装する方法

当ページのリンクには広告が含まれています。
この記事で解決できる悩み
いずみ

こんな悩みを解決できる記事を書きました!

僕は現役フリーランスエンジニア(歴年)で、資格は個保有しています。

LaravelでQueueを使った非同期処理を実装する方法を知りたい」とお考えではありませんか?

メール送信やCSV出力など、時間のかかる処理をコントローラーに直接書くと、レスポンスが遅くなります。

Laravel Queueを使えば、時間のかかる処理をバックグラウンドに逃がしてレスポンス速度を改善できます。

いずみ

ジョブの作成からワーカーの起動、失敗時の対処まで順番に解説します。

ということで、本記事ではLaravel Queueで非同期処理を実装する方法を解説します。

いずみ

すぐ読み終わるので、ぜひ最後まで読んでくださいませ。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
執筆者/監修者
  • フリーランスエンジニア(保有資格個、企業と直接契約
  • ブログ・アフィリエイト歴7年(2018年〜)
  • ブランドせどりで月利50万円⇨脱サラ
  • 投資(仮想通貨・FX)歴7年(2018年〜)
  • X(旧Twitter)フォロワー約1,900人
  • 運営者情報はこちら
いずみです
目次

【Laravel】Queueで非同期処理を実装する方法

早速ですが、Laravel Queueを使った非同期処理の実装方法を解説します。

Laravel Queueの仕組み

Laravel Queueは、時間のかかる処理をジョブという単位に切り出し、キューに積んで別プロセスのワーカーに処理させる仕組みです。

メール送信・画像処理・外部API呼び出しなど、完了まで時間がかかる処理をキューに逃がすことで、ユーザーへのレスポンスを高速に返せます。

キューのバックエンドにはdatabase・redis・sqsなど複数のドライバが用意されており、環境に応じて選択できます。

キュー接続の準備

まずは、キューの接続先を準備します。

STEP
.envでキュー接続を設定する

手軽に試すなら、databaseドライバが便利です。

QUEUE_CONNECTION=database
STEP
jobsテーブルを作成する

databaseドライバを使う場合は、ジョブを記録するテーブルが必要です。

php artisan queue:table
php artisan migrate
いずみ

開発中はdatabaseドライバで十分ですが、本番運用ではRedisを使う構成もよく採用されます。

ジョブクラスを作成する(コード付き)

続いて、会員登録後にウェルカムメールを送信するジョブを例に、実際の処理を作成します。

STEP
make:jobコマンドでジョブを生成する
php artisan make:job SendWelcomeEmail

実行すると、app/Jobsディレクトリの中にSendWelcomeEmailクラスが生成されます。

STEP
handleメソッドに処理を書く
<?php

namespace App\Jobs;

use App\Mail\WelcomeMail;
use App\Models\User;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail implements ShouldQueue
{
    use Queueable;

    public function __construct(
        public User $user,
    ) {}

    public function handle(): void
    {
        Mail::to($this->user->email)->send(new WelcomeMail($this->user));
    }
}

ShouldQueueインターフェースを実装し、Queueableトレイトを使うことで、SendWelcomeEmailクラスはキュー対象のジョブとして扱われます。

コンストラクタで受け取ったUserモデルは自動的にシリアライズされ、ワーカー側で復元されます。

ジョブをディスパッチする

ジョブクラスを作成できたら、コントローラーなどからdispatchメソッドでキューに投入します。

SendWelcomeEmail::dispatch($user);

onQueueメソッドを使うと、送信先のキュー名を指定できます。

delayメソッドを使うと、指定した時間だけ実行を遅らせることも可能です。

SendWelcomeEmail::dispatch($user)->onQueue('emails');

SendWelcomeEmail::dispatch($user)->delay(now()->addMinutes(10));
いずみ

コントローラーだけでなく、イベントリスナーやコマンドなど、どこからでも同じ書き方でジョブを投入できます。

キューワーカーを起動する

ジョブをディスパッチしただけでは処理は実行されません。

キューに積まれたジョブを実際に処理するワーカープロセスを起動する必要があります。

php artisan queue:work

queue:workコマンドには、以下のようなオプションを付けられます。

  • --queue:処理するキュー名をカンマ区切りで優先順に指定
  • --tries:ジョブの最大試行回数を指定
  • --timeout:1回の実行にかけられる最大秒数を指定
  • --sleep:キューが空のときに待機する秒数を指定
php artisan queue:work --queue=emails,default --tries=3 --timeout=90
いずみ

queue:workはプロセス起動時のコードを保持し続けるため、デプロイでコードを変更した後はワーカーの再起動を忘れずに行ってください。

ジョブが失敗したときの対処

外部APIの障害やタイムアウトなどで、ジョブが失敗することもあります。

試行回数や実行時間の上限は、ジョブクラスにPHP属性を付けて指定できます。

use Illuminate\Queue\Attributes\Timeout;
use Illuminate\Queue\Attributes\Tries;

#[Tries(3)]
#[Timeout(90)]
class SendWelcomeEmail implements ShouldQueue
{
    use Queueable;

    // ...
}

指定した試行回数を超えて失敗したジョブは、failed_jobsテーブルに記録されます。

失敗したジョブは、以下のコマンドで確認・再実行・削除ができます。

# 失敗したジョブの一覧を表示
php artisan queue:failed

# 特定のジョブを再実行
php artisan queue:retry {id}

# 失敗したジョブをすべて再実行
php artisan queue:retry all

# 失敗したジョブをすべて削除
php artisan queue:flush
いずみ

failed_jobsテーブルにジョブが溜まったまま放置すると、原因調査が後回しになりがちなので、定期的にqueue:failedを確認する習慣をつけると安心です。

本番環境でワーカーを常駐させる

本番環境では、queue:workプロセスを常時起動させ続ける仕組みが必要です。

ターミナルでqueue:workを直接起動したままにすると、SSH接続が切れた瞬間にワーカーも停止してしまいます。

Supervisorを使うと、ワーカープロセスの常駐や異常終了時の自動再起動を任せられます。

STEP
Supervisorの設定ファイルを作成する

/etc/supervisor/conf.d/laravel-worker.confのようなファイルを作成します。

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /path/to/artisan queue:work --sleep=3 --tries=3 --timeout=90
autostart=true
autorestart=true
stopasgroup=true
numprocs=2
redirect_stderr=true
stdout_logfile=/path/to/storage/logs/worker.log
STEP
Supervisorにワーカーを登録して起動する
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

設定が完了すれば、サーバー再起動後もワーカープロセスが自動的に立ち上がるようになります。

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式

【厳選】フリーランスエンジニアにおすすめなエージェント3選

フリーランスエンジニアになるにはエージェントから案件をもらう必要があります。

僕が実際に利用しているおすすめエージェントを紹介しますね。

いずみ

エージェントは必ず複数登録してください。

担当者によっては「全然案件紹介してくれない…」みたいなこともあるので…

僕は実際に5つのエージェントを使い回していますよ。

フリーランスを始めるなら「

案件数マージン率単価
約88,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 業界最大級の案件数。
  • 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
  • 案件参画中のフォローの充実。

※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。

は業界最大手のフリーランスエージェントです。

とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!

いずみ

僕もはじめてフリーランスの案件を貰ったのはです。

保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。

手厚い保障を重視したいなら「

案件数マージン率単価
約10,000件非公開
初心者福利厚生申し込み
無料
Good Point
  • 手厚い保障で正社員並みの安心感。
  • 還元率60%超え&単価公開でクリアな契約。
  • 給与保障制度(審査あり)。

は手厚い保障が特徴のフリーランスエージェントです。

フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。

いずみ

僕も何度か案件を紹介してもらいました。

自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。

週2〜3日の案件探しなら「

案件数マージン率単価
約5,000件非公開
初心者福利厚生申し込み
経験者向け無料
Good Point
  • IT案件に特化したフリーランスエージェント。
  • 週2〜3日の案件が豊富。
  • リモート案件が多く、直エンドなので単価も高い。

※詳細は「【週2・3案件】ITプロパートナーズとは?メリットや利用手順を解説!」を参照。

はIT案件に特化したフリーランスエージェントです。

週2〜3日から参画できる案件が豊富なので、起業したい人にもおすすめです。

いずみ

週2〜3日の案件はある程度スキルがないと紹介してもらえない印象です。

とはいえ、週5の案件ももちろんありますし、僕が利用した時は迅速・丁寧に対応していただきました!

よくある質問

Queueを使わずに同期処理のままではいけませんか?

メール送信や外部API呼び出しに数秒かかると、ユーザーはレスポンスが返るまで数秒間待たされます。

アクセスが増えた場合はサーバー負荷も高まるため、時間のかかる処理はQueueに逃がす設計をおすすめします。

キューワーカーが動いていない間、ジョブはどうなりますか?

databaseドライバの場合はjobsテーブルに、redisドライバの場合はRedis上に、ジョブが未処理のまま残り続けます。

queue:workを起動すると、蓄積していたジョブから順番に処理が始まります。

database以外に、どんなキュードライバがありますか?

Redis・Amazon SQS・Beanstalkdなど複数のドライバに対応しています。

処理量が多いアプリケーションでは、パフォーマンスに優れたRedisドライバが選ばれることが多いです。

まとめ

今回は、Laravel Queueで非同期処理を実装する方法について解説しました。

以下が本記事のまとめになります。

まとめ
  • Laravel Queueを使うと、時間のかかる処理をレスポンスの外に逃がしてパフォーマンスを改善できる。
  • ジョブクラスはmake:jobコマンドで生成し、handleメソッドに処理を書く。
  • 本番環境ではSupervisorでqueue:workプロセスを常駐させる。
まとめ
  • おすすめ本
¥2,673 (2023/07/23 15:53時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場

Laravelの勉強なら「」が分かりやすくておすすめですよ♪

いずみ

最後までお読みいただき、ありがとうございました!

スクロールできます
【当サイト】おすすめフリーランスエージェント3選
エージェント評価ポイント公式サイト
レバテックフリーランス

5.0
業界最大級のエージェント。
高単価案件が豊富。
公式
Midworks

4.8
満足度調査で
3年連続3冠を達成。
公式
ITプロパートナーズ

4.6
週2〜3向けの案件が豊富。公式
  • クソおすすめ本
¥4,480 (2024/06/01 23:28時点 | Amazon調べ)
\楽天ポイント4倍セール!/
楽天市場
いずみ

海外のエンジニアがどういった思考で働いているかが理解できます。

海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。

この記事が気に入ったら
フォローしてね!

シェアしてね!
  • URLをコピーしました!
目次