You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:50:02