queue:work — キューを実行するコマンド

未分類

Laravel Artisan: queue:work

一言概要
キューのジョブを永続的に処理するワーカー起動コマンド。

  • カテゴリ: artisan
  • バージョン: Laravel 12 / PHP 8.4
  • 関連: queue:listen, queue:restart, queue:flush, queue:failed, queue:retry
  • 変更履歴: Laravel 5.1 から追加、queue:listen と統合して永続ワーカーとして推奨

TL;DR

  • コマンド: php artisan queue:work [options] [<connection>]
  • デフォルトで無限ループ。
  • --daemon は不要(Laravel 8 以降は自動)。
  • --memory でメモリ上限を設定し、超過時に自動再起動。

概要

queue:work は指定した接続を監視し、ジョブを取得して実行します。
queue:listen と同様にジョブが無くても待機しますが、永続プロセスとしてデーモン化され、メモリとジョブ数を自動で管理します。
本番環境では supervisorsystemd でプロセスを管理し、再起動やログローテーションを行うのが標準です。

構文 / シグネチャ

php artisan queue:work [options] [<connection>]
引数 必須 既定値 説明
connection string sync 使用するキュー接続名
--queue string × * 処理対象キュー(複数可)
--daemon bool × false デーモンモード(Laravel 8 以降は自動)
--once bool × false 1ジョブのみ実行して終了
--stop-when-empty bool × false キューが空になったら終了
--max-jobs int × null 実行したジョブ数で停止
--max-time int × null 実行時間で停止(秒)
--timeout int × 60 個々のジョブ実行時間上限(秒)
--sleep int × 3 ジョブが無いときのスリープ時間(秒)
--tries int × 0 失敗ジョブの再試行回数
--memory int × 128 メモリ上限(MB)
--quiet bool × false 出力を抑制
--force bool × false エラーがあっても続行

戻り値: int (0 = 成功, 1 = 失敗)
例外: Illuminate\Queue\Jobs\JobException などジョブ実行時に投げられる。

使用例

# 最小実行
php artisan queue:work
# Redis キューでメール送信ジョブを永続処理
php artisan queue:work redis \
    --queue=emails \
    --memory=256 \
    --tries=3

Tip:本番では supervisor で以下のように設定し、永続化とログ管理を行う。

[program:laravel-queue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work redis --sleep=5 --tries=3
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stdout_logfile=/var/log/laravel/queue.log
stopwaitsecs=3600

よくある落とし穴

症状 原因 対処
メモリリークでプロセスが停止 --memory が不足 --memory を増やす、または --stop-when-empty を併用
長時間ジョブ実行でタイムアウト --timeout が短い --timeout を適切に設定
キュー接続が起動しない 接続設定ミス config/queue.php を確認、サービスが起動しているか確認
失敗ジョブが再試行されない --tries が 0 必要に応じて --tries を設定
サービスが再起動してもプロセスが残る supervisor 設定不備 autorestart=true を確認

代替・関連APIとの比較

API 特徴 推奨ケース
queue:listen 1プロセスで永続実行 旧プロジェクトで互換性が必要
queue:work デーモン化・メモリ管理あり 現行本番環境
queue:restart 既存ワーカーを再起動 設定変更後に実行
queue:flush すべてのジョブを消去 テスト・再実行前に使用
queue:failed 失敗ジョブ一覧 デバッグ・再実行前に確認

選定基準:永続実行・メモリ管理・自動再起動が必要なら queue:work。単一ジョブ実行・スクリプト内で一度だけ処理したい場合は --oncequeue:work、あるいは queue:listen

テスト例(Pest)

it('processes a job from the queue', function () {
    Queue::fake();

    ProcessOrder::dispatch($order = Order::factory()->create());

    Artisan::call('queue:work', ['--once' => true]);

    Queue::assertPushed(ProcessOrder::class);
    Queue::assertPushed(ProcessOrder::class, function ($job) use ($order) {
        return $job->order->id === $order->id;
    });
});

トラブルシュート(エラー別)

エラー 原因 対処
Connection could not be established Redis/Database が起動していない サービスを起動、接続設定を確認
Job timed out タイムアウト値が短い --timeout で延長
Out of memory メモリ上限不足 --memory を増やす
Command Not Found Artisan がロードされていない PHP バージョン・composer autoload を確認

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする