Laravel 10中Redis队列失败任务未存入failed_jobs表问题求助
检查队列失败任务驱动配置
确认.env里的QUEUE_FAILED_DRIVER设置为database——如果设成redis,失败任务会存在Redis中,不会写入failed_jobs表,导致queue:failed和queue:retry命令无法识别,只有Telescope能捕获记录。同时核对config/queue.php里的failed配置块:'failed' => [ 'driver' => env('QUEUE_FAILED_DRIVER', 'database'), 'database' => env('DB_CONNECTION', 'mysql'), 'table' => 'failed_jobs', ],确认
failed_jobs表已正确创建
执行php artisan queue:failed-table生成迁移文件,再运行php artisan migrate创建表。如果表不存在或结构错误,即使驱动配置正确也无法写入数据。Laravel 10的failed_jobs表必须包含id, uuid, connection, queue, payload, exception, failed_at字段。检查队列worker的启动参数
启动worker时如果用了--tries=0或者未指定重试次数,任务失败后会直接被丢弃,不会进入失败任务存储。确保启动命令类似:php artisan queue:work redis --tries=3。另外注意--timeout参数是否合理,避免超时失败未被正确捕获。检查任务类的
failed()方法实现
如果任务类重写了failed()方法,必须调用父类的failed()实现,否则Laravel默认的失败任务存储逻辑不会执行:public function failed(Throwable $exception) { // 自定义失败处理逻辑 parent::failed($exception); // 必须保留这行触发默认存储 }清理Redis中残留的失败任务记录
若之前曾将QUEUE_FAILED_DRIVER设为redis,Redis里可能存了旧的失败任务缓存。打开redis-cli,执行KEYS *failed*找到对应键,再用DEL命令删除,避免干扰当前配置。手动触发测试任务验证
写一个简单的测试任务触发失败,验证是否写入failed_jobs表:dispatch(function () { throw new \Exception('测试失败任务'); });运行worker后,查看
failed_jobs表是否有新增记录,同时用php artisan queue:failed命令确认是否能查到。
内容的提问来源于stack exchange,提问作者SlashCart Work

