添加Sentry失败任务通知后Laravel Horizon页面内存溢出,如何兼容?
解决Laravel Horizon与Sentry失败任务通知冲突的方案
问题根源
Horizon在渲染Failed Jobs页面时,会实例化所有失败的任务并调用其failed方法,导致你的Sentry捕获逻辑被批量触发,短时间内大量重复的异常捕获操作直接耗尽了内存。
具体修复方案
1. 限制Sentry上报仅在队列Worker环境触发
修改任务类的failed方法,增加运行环境判断,只有当队列Worker处理任务失败时才上报Sentry:
/** * Handle a job failure. * * @return void */ public function failed(\Exception $exception) { // 仅在控制台(队列Worker)环境下执行Sentry上报 if (app()->bound('sentry') && app()->runningInConsole()) { app('sentry')->captureException($exception); } }
2. 改用Sentry官方队列监听替代自定义逻辑
Laravel集成的Sentry包已经内置了失败任务的监听机制,无需在每个任务中重复编写代码:
- 确认
config/sentry.php中已启用队列失败事件监听:
'listen' => [ \Illuminate\Queue\Events\JobFailed::class => \Sentry\Laravel\Listeners\JobFailedListener::class, ],
- 删除任务类中的自定义
failed方法,由Sentry官方监听类处理失败任务的异常上报,这样Horizon加载失败任务列表时不会触发上报逻辑。
3. 优化Horizon失败任务加载数量
如果失败任务总数极大,可调整Horizon的分页配置,减少单次页面加载的任务数量:
在config/horizon.php中修改:
'failed' => [ 'limit' => 50, // 降低单次加载的任务数,默认值为100 ],
内容的提问来源于stack exchange,提问作者micky
相关产品推荐
相关产品推荐

