Laravel Horizon不显示laravel-echo队列消息如何排查
Laravel Echo 消息队列在Horizon面板无记录排查方向
- 首先核对广播任务的队列连接、队列名是否在Horizon监控范围内
打开config/broadcasting.php查看Redis广播驱动的配置项,重点看queue.connection和queue.queue两个参数:Laravel广播事件默认不会走全局队列配置,而是优先用广播配置里指定的连接和队列名,很多人会单独给广播分配独立队列(比如broadcasts队列),但config/horizon.php对应环境下supervisor进程配置的queue监听列表没加这个队列名,Horizon只会采集自己监听范围内的队列任务,不在列表里的任务不会在面板展示。 - 确认广播事件是否真的走了异步队列分发
检查你所有触发Socket推送的事件类:如果事件实现的是ShouldBroadcastNow接口,这类广播是同步执行的,不会生成队列任务,自然不会在Horizon留痕;只有实现ShouldBroadcast接口的事件才会走队列异步分发。另外也要检查事件里有没有重写broadcastQueue方法、或者自定义了队列分发逻辑,绕过了默认的任务上报流程。 - 核对Redis连接、库号配置是否一致
打开config/database.php查看Redis连接配置,确认Horizon使用的Redis连接、库号、key前缀和广播队列使用的完全一致:比如Horizon连的是redis连接的db 1,但广播消息写到了db 0,或者两边配置的Redis key前缀不一样,Horizon根本扫不到对应队列的key,自然不会展示记录。这里要注意区分Redis原生Pub/Sub消息和队列任务:Echo的部分连接信令是直接走Pub/Sub不进队列的,但你确认业务消息已经进入队列流转的话,重点查连接配置一致性即可。 - 检查Horizon的任务保留与过滤配置
查看config/horizon.php里的trim配置项,要是已完成任务的保留时间设得过短(比如设成1分钟),广播任务本身执行速度极快,等你打开面板的时候任务记录已经被自动清理了,就会看不到。另外也要检查有没有在HorizonServiceProvider里写过任务过滤回调,把广播类任务排除出了面板展示范围。 - 确认队列Worker的启动方式
如果你处理广播队列的Worker是手动通过php artisan queue:work命令启动的,不是通过php artisan horizon启动的主进程托管的,那这些Worker处理的任务不会向Horizon上报执行记录,面板自然看不到。只有Horizon主进程拉起的Worker处理的任务才会被面板采集统计。
快速验证技巧:找一个触发Socket推送的业务事件,手动在类里加上
public $connection = 'redis'; public $queue = 'default';,强制它走你之前测试TestJob用的连接和队列,触发一次事件后刷新Horizon面板,如果能看到记录,就可以确定是之前的队列/连接配置不匹配导致的问题。
内容的提问来源于stack exchange,提问作者Винсентэ Пуххини
相关产品推荐
相关产品推荐

