Laravel 尝试次数过多或运行时间过长,任务可能此前已超时:错误解决办法
唔呀唔呀…… 出现错误了! 我到处查了查……也都试过了,但还是没解决。后来找到原因才发现,90 秒后就会出现这样的提示,不过 Queue 还是正常处理了! 哇……这到底是会毫无意义地堆积在日志里吗?为什么呢???我就这样一直查了下去……\ 我的 Queue 任务比想象中要久,会运行 3~5 分钟, 我在 Google
唔呀唔呀……
唔呀唔呀…… 出现错误了! 我到处查了查……也都试过了,但还是没解决。后来找到原因才发现,90 秒后就会出现这样的提示,不过 Queue 还是正常处理了! 哇……这到底是会毫无意义地堆积在日志里吗?为什么呢???我就这样一直查了下去……\ 我的 Queue 任务比想象中要久,会运行 3~5 分钟, 我在 Google
唔呀唔呀……
出现错误了!
我到处查了查……也都试过了,但还是没解决。后来找到原因才发现,90 秒后就会出现这样的提示,不过 Queue 还是正常处理了!
哇……这到底是会毫无意义地堆积在日志里吗?为什么呢???我就这样一直查了下去……
我的 Queue 任务比想象中要久,会运行 3~5 分钟,
我在 Google 上搜索后发现,有人说改成 redis 就能解决,于是我试着把队列改成了 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 版本,虽然似乎改成了
不过……
总之,就算你把上面两个值怎么设置都行,只要它们低于 redis queue.php 中设置的 retry_after 值,就会出问题。
retry_after 值必须设置得比上面两个选项的值,或者运行 queue 时使用的 timeout 值都要大。
用 queue 用到现在,竟然连这个都不知道……真是的……
另外……其实不设置 retry_after 也可以吧?每个 queue 的 timeout 应该都不一样……能不能为每个 queue 单独设置 retry_after 呢?嗯……感觉好像有,又好像没有……再多找找说不定能找到,不过根据我 Google 的结果,好像是没有?
所以,因为我在 queue:work 中使用了 --timeout 1800 选项,
就把 queue.php 中 redis 的 retry_after 值改成了 1860……