已完成Silenced任务未按Horizon配置自动清理的问题求助
问题求助:Laravel Horizon中Silenced任务未按配置清理,长期占用Redis空间
我每小时会产生约7000个实现了Silenced接口的任务,这些任务均能正常运行并完成。按照Horizon的配置,已完成任务应在1小时后自动清理,但这类Silenced任务却在Redis中留存7天,占用大量存储空间,特此寻求解决办法。
Horizon 配置
/* |-------------------------------------------------------------------------- | Job Trimming Times |-------------------------------------------------------------------------- | | Here you can configure for how long (in minutes) you desire Horizon to | persist the recent and failed jobs. Typically, recent jobs are kept | for one hour while all failed jobs are stored for an entire week. | */ 'trim' => [ 'recent' => 60, 'pending' => 60, 'completed' => 60, 'recent_failed' => 10080, 'failed' => 10080, 'monitored' => 10080, ],
任务代码
class ClearCategorySkusJob implements ShouldBeUnique, ShouldQueue, Silenced { use Dispatchable, Queueable; public int $tries = 3; public function __construct( private readonly string $category, private readonly string $domain, ) { $this->onQueue('cache'); } public function handle(): void {} public function uniqueId(): string {} public function tags(): array {} }
环境版本
- PHP版本:8.2.26
- Redis版本:6.2.13
- Laravel版本:10.48.24
- Horizon版本:5.24.3
解决思路与方案
1. 确认Silenced任务的存储分类
Silenced接口会让任务跳过Horizon的常规统计记录,但这类任务可能被归类到了monitored或其他保留周期更长的集合中。可以通过Redis客户端查看Horizon相关的键(比如horizon:jobs:monitored),确认任务存储位置后,对应调整该分类的修剪时间。
2. 自定义任务修剪逻辑
可以在任务的handle方法执行完毕后,手动触发清理逻辑;或者扩展Horizon的修剪命令,针对Silenced任务单独处理,确保任务完成后被及时清理。
3. 升级Horizon版本
当前使用的Horizon 5.24.3可能存在Silenced任务修剪的bug,建议升级到最新稳定版本,查看官方更新日志确认是否有相关修复。
4. 强制定时修剪
临时解决方案可通过定时任务每小时执行一次Horizon修剪命令,强制清理过期任务:
php artisan horizon:trim
将该命令加入Laravel调度(app/Console/Kernel.php):
protected function schedule(Schedule $schedule) { $schedule->command('horizon:trim')->hourly(); }
5. 检查队列专属配置
确认cache队列是否在Horizon的environments配置段中被单独设置了特殊的保留时间,若有则调整为符合需求的时长。
内容的提问来源于stack exchange,提问作者Martijn Bastiaansen
相关产品推荐
相关产品推荐

