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