应先检查 Redis 中是否有积压消息,再确认 laravel-echo-server 是否正常运行及配置是否一致,最后验证前端 WebSocket 是否直连 6001 端口并核对频道名匹配。
查 Redis 里有没有堆积的未消费广播消息
广播消息走队列 + redis 驱动时,如果前端收不到,第一反应不该是改前端代码,而是确认消息到底发没发出去、有没有卡在中间。laravel 广播事件被 dispatch 后,会先序列化写入 redis 的 laravel_database_broadcasts(或你自定义的前缀)列表,再由 laravel-echo-server 或 soketi 拉取转发。如果这个列表里有数据但前端始终不触发,说明消息“发了”,但没“送出去”。
- 用
redis-cli连上你的 Redis,执行LLEN laravel_database_broadcasts(注意前缀是否被修改过)——值大于 0 就代表有积压 - 用
LRANGE laravel_database_broadcasts 0 -1看具体内容,确认是不是你刚触发的事件(比如含"event":"App\Events\OrderShipped") - 如果积压持续增长,大概率是
laravel-echo-server没起来、崩了,或者配置的 Redis 地址/DB 和 Laravel 不一致
验证 laravel-echo-server 是否真在监听正确频道
laravel-echo-server 不是“启动就完事”,它必须和 Laravel 的广播配置严格对齐,否则就像两个电台调频没对上——都开着,但互相听不见。
- 检查
laravel-echo-server.json中的redis.host、redis.port、redis.database是否和.env里的REDIS_HOST、REDIS_PORT、REDIS_DB完全一致(尤其注意 database 默认是 0,但很多人配成 1 或 3) - 确认
laravel-echo-server启动时输出的日志里有类似Channel: private-user.123 subscribed—— 如果连订阅日志都没有,说明前端根本没连上来 - 运行
ps aux | grep echo-server看进程是否存活;若用 pm2 管理,别忘了pm2 restart laravel-echo-server后要等几秒再测,它冷启动有延迟
前端 Echo 实例是否连上了正确的 Socket 端口
这是最隐蔽也最高频的失败点:浏览器看似连接成功,实际连的是 Nginx 的 443,而不是 laravel-echo-server 的 6001。结果就是握手成功、心跳正常、但事件永远不触发。
- 打开浏览器开发者工具 → Network 标签页 → 刷新页面 → 找
websocket类型请求 → 点开看它的Request URL:如果是wss://yourdomain.com/socket.io/...(没带端口),那就错了 - 必须确保前端初始化 Echo 时显式写了端口:
host: window.location.hostname + ':6001',不能只靠window.location.hostname - 同时核对 Nginx 配置中
location /socket.io/的proxy_pass是指向http://127.0.0.1:6001/(非 https),且启用了proxy_http_version 1.1和proxy_set_header Upgrade $http_upgrade
为什么 event 数据到了 Redis 却没进频道?检查广播通道权限逻辑
即使消息进了 Redis,laravel-echo-server 也会根据事件类的 broadcastOn() 返回值决定往哪个频道发。而频道名一旦和前端监听的不一致,就等于投递到了错误邮箱。
- 私有频道(
PrivateChannel)和存在频道(PresenceChannel)需要后端提供认证接口(api/broadcasting/auth),如果该接口返回 403 或空响应,Echo 就不会真正加入频道 - 检查事件类中
broadcastOn()返回的频道名,比如new PrivateChannel('user.' . $this->id),然后对比前端private-user.123的写法——注意中间是点还是横线、大小写、是否漏了private-前缀 - Redis 中存的消息体里有
"channel"字段,直接比对它和你前端listen()的频道名是否完全一致(包括所有符号和大小写)
最容易被忽略的是:你以为消息“发了”,其实它卡在 Redis 列表里没被消费;你以为“连上了”,其实 WebSocket 握手连的是 Nginx 而不是 echo-server。这两处不肉眼确认,光刷前端代码只会越调越迷。


















