Larvelで非同期処理を試してみた

こんにちは、コバヤシです。
今回はLaravel8で非同期処理を試してみました。

テーブルを作成する

Laravelで非同期処理をするには「queue(キュー)」を使用します。
このqueueで使うテーブルを作成します。

php artisan queue:table
php artisan migrate

jobsというテーブルが作成されます。

.envの変更

queue(キュー)をどこに保存するか指定する箇所があるので変更します。
今回はデータベースを使用するのでQUEUE_CONNECTIONをdatabaseとします。

QUEUE_CONNECTION=database

Jobファイルを作成する

queue(キュー)に実行させるジョブを作成します。

php artisan make:job TestJob

これで、/app/Jobs/TestJob.phpが作成されます。

Jobの処理を記述する

<?php
class TestJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        \Storage::put('test.txt', 'テストです');
    }
}

handle内に処理を記述します。
今回は簡単なファイル書き出しにしていますが、 本来はもっと重い処理を書くことになるかと思います。

Jobに登録する

<?php

namespace App\Http\Controllers;
  
use App\Jobs\TestJob;
  
class TestController extends Controller
{
    public function index()
    {
       // Jobに登録する
        TestJob::dispatch();
  
        return view('index');
    }
}

該当のJobクラスのdispatchメソッドを実行することで、Jobに登録出来ます。
jobsテーブルを見ると、登録されていることが確認できます.。
この状態では登録されただけで実行はされていません。

Jobを実行する

php artisan queue:work

上記コマンドでワーカーが起動し、Jobが処理されます。
TestJobが実行され、ファイルが作成されますが、今回の処理の軽さでは
一瞬でファイル作成されてしまうため非同期かどうか判断が難しいですね・・

なのでJobが1分後に実行されるようにしてみます。

<?php

namespace App\Http\Controllers;
  
use App\Jobs\TestJob;
  
class TestController extends Controller
{
    public function index()
    {
       // Jobに登録する
        TestJob::dispatch()->delay(1);
  
        return view('index');
    }
}

delayを使って1分後に実行されるようにすると
確かに非同期で処理が行われていることがわかります。

まとめ

本番の運用ではワーカーを監視するなどの対策が必要ですが、 Laravelではqueueを使えば簡単に非同期処理が実装できました。
重い処理などに使っていけたらと思います。