Laravel Queue を利用したタスク処理

Laravel で Queue を利用して非同期にタスクを処理するフローを紹介していきます。

Queue は Laravel 上で非同期な処理を実行するための行列システムです。

Queue を利用することで、ジョブを非同期に実行することができるようになるだけでなく、抽象的なジョブを Artisan や Web上から自由に発行することができるようになります。

ジョブの作成

Queue を利用した非同期な処理を行うには、Artisan などで記述している処理を、一旦 Job で実装する必要があります。

<?php

namespace App\Jobs;

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

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

    public function handle()
    {
        logger()->info("Process uploaded podcast...");
    }
}

Jobは Illuminate\Contracts\Queue\ShouldQueue のインターフェイスを実装したシンプルなクラスです。
handle メソドで実際の処理を記述します。 コンストラクタおよび handle メソドで DI を利用することも可能です。

このテンプレートは以下のコマンドで作成することもできます。

$ php artisan make:job ProcessPodcast

ジョブの実行

ジョブのstatic メソドで実装されている dispatch をコールしてジョブの実行を行うことができます。dispatch の引数に渡された内容は、 ジョブのクラスのコンストラクタに渡されます。

Artisan::command('debug:queue', function () {
    \App\Jobs\ProcessPodcast::dispatch();
    logger()->info("Job Executed!");
});

環境変数が QUEUE_DRIVER=sync で実装されている限り、dispatch をコールした時点で同期的に Jobが処理されます。ログには以下の順でテキストが表示されるはずです。

  • Process uploaded podcast…
  • Job Executed!

dispatch は Artisan だけでなく、Controller などからも コールすることができます。

ジョブの非同期な実行

環境変数での QUEUE_DRIVER=sync は、 シンプルに Queue を実行させるための 設定です。この設定下では、すべてのキューは同期的にコールされたタイミングで即時処理されます。

キューを非同期に処理するためには、キューのドライバの設定が必要です。まずはDBを利用した database ドライバを試してみましょう。

キューのテーブルの制作のために以下のコマンドを実行します。database/migrations フォルダにファイルが追加され、テーブルが作成されます。

$ php artisan queue:table
$ php artisan migrate

準備ができたら QUEUE_DRIVER=syncQUEUE_DRIVER=database に変更して ジョブを dispatch してみましょう。ログを確認してみても、 ジョブのhandle 内の処理は実行されず、コマンド処理のみのみが終了するのが確認できると思います。

ジョブは実行されず代わりにジョブのデータが DBのテーブル内に蓄積されていきます。これらのジョブを処理するには、以下のコマンドを立ち上げます。

$ php artisan queue:work

これでジョブが非同期に処理されるようになったはずです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です