ThinkPHP 6.1 队列升级异常主因是配置语义变更与驱动行为收紧:retry_after 影响多驱动失败判定,failed_jobs 表结构需更新(failed_at/uuid),任务类须用 public $maxTries,timeout 默认启用且需合理配置。

升级后队列任务执行异常,大概率不是代码逻辑问题,而是配置项语义变更或驱动行为收紧导致的静默失败。 ThinkPHP 6.1 对 queue 组件做了几处关键调整,尤其在失败判定、重试触发和 Redis 连接管理上更严格,老项目升级后常出现“任务进队但不执行”“重试不生效”“failed_jobs 表没记录”等现象。
检查 config/queue.php 中的 retry_after 是否仍有效
6.1 版本起,retry_after 不再仅作用于 Redis 驱动的“任务超时释放”,它还参与数据库驱动的失败判定逻辑。若该值小于任务实际耗时,框架会提前标记为失败并重试——哪怕任务其实还在跑。
- 确认你所有连接配置(尤其是
connections.redis和connections.database)都显式声明了'retry_after' => 120(单位秒),不能依赖默认值 - 对比任务最长执行时间(比如导出 Excel 耗时 85 秒),确保
retry_after至少比它多 30 秒 - 若用数据库驱动,
retry_after会直接影响failed_jobs.attempts的更新时机;设太小会导致“假失败”+重复入队
验证 failed_jobs 表结构是否匹配 6.1
ThinkPHP 6.1 将 failed_jobs 表的失败时间字段从 fail_time 改为 failed_at,且新增了 uuid 字段(非空)。升级后若沿用旧表结构,php think queue:failed 命令可能报错或漏写记录。
- 运行
php think migrate:status查看是否有未执行的队列迁移文件(如2021_01_01_000000_create_failed_jobs_table.php) - 手动检查表字段:
DESCRIBE failed_jobs;,确认存在failed_at(datetime 类型)、uuid(varchar(255))、exception(longtext) - 若字段缺失,不要直接 ALTER,建议备份后执行
php think migrate:refresh --path=runtime/migrate/queue(路径以 vendor/topthink/think-queue/src/command/Migrate.php 生成的实际位置为准)
排查任务类中 $maxTries 和 $tries 的混用
6.0 兼容 public $maxTries 和 public $tries,而 6.1 明确只识别 $maxTries。若你沿用了旧任务类里写的 protected $tries = 3,重试将完全失效。
- 打开你的任务类(如
app/job/SendNoticeJob.php),确认重试属性是:public $maxTries = 3;,不是$tries,也不是protected或private - 命令行启动时若带
--tries=1参数,它仍会覆盖$maxTries,升级后建议统一移除该参数,靠类属性控制 -
sync驱动下$maxTries无效——务必确认config/queue.php的'default'已明确设为'redis'或'database',而非留空或注释掉
监听进程是否因 timeout 设置被中断
6.1 强化了消费者进程的超时保护,默认启用 timeout 机制(单位秒),一旦单个任务 handle() 执行超时,进程会主动退出,不再继续消费。这容易被误判为“任务卡死”或“Supervisor 反复重启”。
- 检查
config/queue.php中对应驱动下是否有'timeout' => 60类似配置;若没有,6.1 会 fallback 到 60 秒硬限制 - 临时调试可加
--timeout=0启动:php think queue:work --timeout=0,观察是否恢复正常 - 生产环境不建议设为 0,应根据任务类型调整:短信类设 30,报表导出类设 300,并配合
retry_after错开(例如retry_after=330)
最易被忽略的是:6.1 默认关闭了对 ValidateException 等业务异常的自动捕获上报,如果任务里抛出的是自定义异常但没继承 Exception,或者被中间件提前拦截,failed_jobs 就不会写入——此时得去 storage/log/queue.log 里翻原始错误,而不是只盯 failed 表。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











