Laravelには標準で、”queue”という仕組みが存在します。
リクエストされた順に処理を実行したり。「呼び出しから~分後に実行する」というような、ちょっとステートフルな処理を簡単に行うことができるようになります。
今回、後者の”「呼び出しから~分後に実行する」”処理を実装しました。
Laravel Queueを利用して非同期によるメール送信 – 思考の葉
こちらのサイトを参考に下記のように記述しました。
hogeController.php
class hogeController extends Controller
{
//省略
public function piyo($hogeId): JsonResponse
{
$Hoge = Hoge::findOrFail($hogeId);
hogeJob::dispatch($Hoge)->delay(now()->addMinutes(Config::get('app.huga', 10)));
}
//省略
}
上記のソースは、hogeJobクラス内に記述された処理を10分遅延させる例ですが、これを実行した際、なぜか処理が遅延されることなく、すぐに送信されてしまう状況でした。
手順どおりにやっていたので、なぜおかしいのかわからず、最初少し焦りましたが、すぐに原因がわかりました。
Laravelの環境別設定ファイルである.envに次のデフォルトで次のような記述があります。
QUEUE_CONNECTION=sync
queueを使用する場合、この部分をqueueの保存先に合わせて変更する必要があるのですが、今回の場合、syncのままになっていたのが原因で、delay()が効かなくなっていました。
今回の環境では、queueの保存先にDBを使用するつもりだったので、
QUEUE_CONNECTION=database
としたところ、無事delay()が動作するようになりました。
queueが想定通り動かなくて困った際は、こういった設定周りももう一度確認してみることが、早い解決につながるかもしれませんね。