Laravel Horizon未自动处理notifications队列问题求助
别急,Horizon确实应该自动处理你配置的所有队列任务,出现这个情况大概率是配置或者服务运行的环节出了问题,咱们一步步排查:
检查Horizon的Supervisor配置
打开config/horizon.php,找到对应环境(比如local或production)的supervisor配置块。你需要确保其中的queue数组包含notifications,比如:'local' => [ 'supervisor-1' => [ 'connection' => 'redis', 'queue' => ['default', 'notifications'], // 必须包含notifications队列 'balance' => 'auto', 'processes' => 3, 'tries' => 3, ], ],如果这里只写了
default,那Horizon的worker只会盯着default队列跑,完全不会处理notifications的任务。修改后记得重启Horizon生效。确认Horizon服务是否持续运行
如果你只是在终端手动执行php artisan horizon,那关闭终端后Horizon就停了,自然不会自动处理任务。生产环境一定要用进程管理器(比如Supervisor、Systemd)来托管Horizon进程,保证它一直运行。
你可以先执行php artisan horizon:status看看Horizon是不是处于运行状态,如果显示Horizon is not running.,那就手动启动它:php artisan horizon,然后测试任务是否自动处理。检查Horizon面板的队列状态
访问Horizon的Web面板(默认路径是/horizon),找到notifications队列对应的worker组,看看是不是被手动暂停了。有时候可能误操作在面板里暂停了队列,只需要点击"Resume"按钮恢复即可。面板里还能看到队列的任务积压情况、worker的运行状态,能帮你快速定位问题。验证Redis连接和任务推送
确保你的队列和Horizon用的是同一个Redis实例(检查config/database.php里的Redis配置),避免任务推送到了A Redis,而Horizon盯着B Redis。另外可以用Redis客户端确认任务是否真的进入了notifications队列:redis-cli LRANGE queues:notifications 0 -1如果能看到任务数据,说明推送没问题,问题出在Horizon的处理环节。
重启Horizon服务
有时候配置修改后需要重启Horizon才能生效,执行php artisan horizon:terminate,然后重新启动Horizon,让它加载新的配置。
按照上面的步骤排查,基本就能解决notifications队列无法自动处理的问题了。
内容的提问来源于stack exchange,提问作者Wonka

