「Laravelで試行回数が多すぎるか、実行時間が長すぎます。ジョブは以前にタイムアウトした可能性があります」エラーの解決方法
むにゃむにゃ…… エラーが発生した! ええと、、あちこち調べて、いろいろ試してみたけれど解決せず、原因を調べてみると、90秒後にこのように表示されていた。ただし、Queue自体は正常に処理されていた! うわ、、ログに無駄に溜まっているのか? どうして???と思い、ずっと調べてみた……\ 私のQueueの処理は、思ったよ
むにゃむにゃ……
むにゃむにゃ…… エラーが発生した! ええと、、あちこち調べて、いろいろ試してみたけれど解決せず、原因を調べてみると、90秒後にこのように表示されていた。ただし、Queue自体は正常に処理されていた! うわ、、ログに無駄に溜まっているのか? どうして???と思い、ずっと調べてみた……\ 私のQueueの処理は、思ったよ
むにゃむにゃ……
エラーが発生した!
ええと、、あちこち調べて、いろいろ試してみたけれど解決せず、原因を調べてみると、90秒後にこのように表示されていた。ただし、Queue自体は正常に処理されていた!
うわ、、ログに無駄に溜まっているのか? どうして???と思い、ずっと調べてみた……
私のQueueの処理は、思ったより時間がかかり、3~5分ほど実行されるものだった。
Googleで調べたところ、redisに変えれば解決するとあったので、Queueをredisに変更してみた。
しかし、それでも発生する!
その後に見つけたものではあるけれど、上記のメッセージが表示される理由はただ一つだ。
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
'after_commit' => false,
],上記の config/queue.php では、redisの retry_after が90に設定されているはずだ。
(あ~、また画像がアップロードできない、、、WordPressの権限問題、どうすればいいんだ)
まさにここで、、発生する問題がこれだ。redisで queues:default:reserved を受け取ったとき、score、つまり有効期限が90秒になるという意味だ。
つまり、redisでQueueがreservedされて登録されるとき、最終的な有効期限は90秒になる(必ず固定のようだ。queue.php に設定した値 retry_after のまま……
それで調べてみると、7系にはこのようなものがあり、
8系では
に変わったようだが……
いずれにしても、上記2つの値をいくら設定してみても、redisの queue.php で設定した retry_after の値より小さければ問題が起きるということだ。
上記2つのオプション値や、Queueを実行するときに使うtimeout値よりも、必ず retry_after の値を大きく設定しておかなければならない。
Queueを使っていて、今までこれを一つも知らなかったなんて、、まったくもう……
また……わざわざ retry_after を設定しなくても、Queueごとにtimeoutは違うはずなのに……Queueごとに retry_after を設定できないのだろうか? うーん……ありそうな気もするし、なさそうな気もする……もっと調べれば見つかるかもしれないけれど、Googleで調べた限りでは、ない?ような気もする……
そこで私は queue:work に --timeout 1800 オプションを指定しているので、
queue.php の redis の retry_after の値を1860に変更しておいた……