【Laravel】でdelay()が利かないときに確認したいこと

  • 2021年6月21日
  • 2021年6月21日
  • Laravel

Laravelの機能の一つに”Job”と呼ばれるものがあります。

ステートレスな言語であるPHP上で、処理待ちなどを簡単に実現することができる機能で、これを用いて、処理の遅延実行などを行うこともできるようになっています。

例えば、

<?php

namespace App\Jobs;

use App\Mail\Admin\Classes\AcceptUserMail;
use App\Models\Member;
use http\Exception\RuntimeException;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Collection;
use Log;
use Mail;


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

    private array $data;
    private bool $accept;

    /**
     * Create a new job instance.
     *
     * @param Member $Member
     * @param bool $accept
     */
    public function __construct()
    {
        // パラメーターの取得など
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(): void
    {
        // Something ToDo
    }
}

Jobクラスを一つ作成し、下記のようにすると、Jobクラス内の処理を遅延実行させることができます。

 HogeJob::dispatch()->delay(now()->addMinutes(10); // 10分後にHogeJobクラスを実行する

ところが、先日、エラーがあるわけでもないのに上記の記述で10分待たずに即時に実行される現象が発生しました。

処理を順に追っていき、どこで不具合が起きているのか調べたのですが、原因がわからず…

頭を抱えていたところ、ある点に気づきました。

Laravel直下の.env内の1行が、次のような指定になっていました。

QUEUE_CONNECTION=sync

Job機能を使用する際、Queueされたタスクを記録しておくストレージをここで指定する必要があるのですが、不具合が起きていた環境では、上記のような指定になっていました。

もしやこれではと思い、次のように記述を変更してみました。

QUEUE_CONNECTION=database

するとタスクがDB上のテーブルに記録されるようになり、delay()メソッドも効くようになりました!

QUEUE_CONNECTION=sync

の指定はLaravelのデフォルト値になっているので、もし同様の現象で悩まされている方は、設定値が正しいか、確認してみるとよいかもしれません。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG