いずみこんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴10年)で、資格は13個保有しています。
「LaravelでQueueを使った非同期処理を実装する方法を知りたい」とお考えではありませんか?
メール送信やCSV出力など、時間のかかる処理をコントローラーに直接書くと、レスポンスが遅くなります。
Laravel Queueを使えば、時間のかかる処理をバックグラウンドに逃がしてレスポンス速度を改善できます。



ジョブの作成からワーカーの起動、失敗時の対処まで順番に解説します。
ということで、本記事ではLaravel Queueで非同期処理を実装する方法を解説します。



すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
【Laravel】Queueで非同期処理を実装する方法
早速ですが、Laravel Queueを使った非同期処理の実装方法を解説します。
Laravel Queueの仕組み
Laravel Queueは、時間のかかる処理をジョブという単位に切り出し、キューに積んで別プロセスのワーカーに処理させる仕組みです。
メール送信・画像処理・外部API呼び出しなど、完了まで時間がかかる処理をキューに逃がすことで、ユーザーへのレスポンスを高速に返せます。
キューのバックエンドにはdatabase・redis・sqsなど複数のドライバが用意されており、環境に応じて選択できます。
キュー接続の準備
まずは、キューの接続先を準備します。
手軽に試すなら、databaseドライバが便利です。
QUEUE_CONNECTION=databasedatabaseドライバを使う場合は、ジョブを記録するテーブルが必要です。
php artisan queue:table
php artisan migrate


開発中はdatabaseドライバで十分ですが、本番運用ではRedisを使う構成もよく採用されます。
ジョブクラスを作成する(コード付き)
続いて、会員登録後にウェルカムメールを送信するジョブを例に、実際の処理を作成します。
php artisan make:job SendWelcomeEmail実行すると、app/Jobsディレクトリの中にSendWelcomeEmailクラスが生成されます。
<?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:workqueue: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を使うと、ワーカープロセスの常駐や異常終了時の自動再起動を任せられます。
/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.logsudo 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つのエージェントを使い回していますよ。
フリーランスを始めるなら「レバテックフリーランス


」
- 業界最大級の案件数。
- 業界トップクラスの高単価報酬、低マージン(平均年収862万円)。
- 案件参画中のフォローの充実。
※詳細は「【業界最大手】レバテックフリーランスとは?メリットや利用手順を解説!」を参照。
レバテックフリーランス
![]()
![]()
とにかく案件数が多いので、とりあえず登録しておけば間違いないエージェントです!



僕もはじめてフリーランスの案件を貰ったのはレバテックフリーランス
![]()
![]()
保有している案件数が多いので、業務経験がなくても何かしらの案件は紹介してもらえますよ(僕はJavaの経験3年でも案件を貰えました)。
手厚い保障を重視したいなら「Midworks


」
- 手厚い保障で正社員並みの安心感。
- 還元率60%超え&単価公開でクリアな契約。
- 給与保障制度(審査あり)。
Midworks
![]()
![]()
フリーランスを目指しているけど不安な方や保障を重視したい方におすすめです。



僕も何度か案件を紹介してもらいました。
自分のスキルに合った案件を紹介してもらえましたし、電話のやり取りも非常に丁寧でした。
週2〜3日の案件探しなら「ITプロパートナーズ


」
- 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の勉強なら「PHPフレームワーク Laravel入門 第2版



最後までお読みいただき、ありがとうございました!
| 【当サイト】おすすめフリーランスエージェント3選 | |||
|---|---|---|---|
| エージェント | 評価 | ポイント | 公式サイト |
レバテックフリーランス | 5.0 | 業界最大級のエージェント。 高単価案件が豊富。 | 公式 |
Midworks | 4.8 | 満足度調査で 3年連続3冠を達成。 | 公式 |
ITプロパートナーズ | 4.6 | 週2〜3向けの案件が豊富。 | 公式 |
- クソおすすめ本



海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。









