Laravel 5.5 自身不提供 WebSocket 服务,需依赖广播驱动与外部 WebSocket 服务器(如 Pusher、laravel-websockets 或 Swoole)协同;仅配置 BROADCAST_DRIVER=redis 而未启动 WebSocket 服务,前端无法接收消息。

直接说结论:Laravel 5.5 自身不提供 WebSocket 服务,必须靠广播驱动 + 外部 WebSocket 服务器(如 Pusher、Laravel WebSockets 或自建 Swoole)协同工作;只配 BROADCAST_DRIVER=redis 但没起 WebSocket 服务,前端永远收不到消息。
为什么 Laravel 5.5 的 broadcast() 不等于 WebSocket 推送
Laravel 5.5 的广播系统本质是“事件分发协议适配层”,不是网络服务。它把事件序列化后扔进 Redis(或 Pusher API),但不会自己监听连接、维持长链接、处理心跳——这些全得靠外部 WebSocket 服务来干。
常见错误现象:Event::dispatch(new MessageSent) 执行成功,Redis 里能看到数据,但前端 Echo 一直卡在 connecting 或完全无响应。
- 根本原因:广播事件发出去了,但没人把 Redis 里的消息“翻译”成 WebSocket 帧推给浏览器
- 开发环境最省事的解法是用
beyondcode/laravel-websockets,它模拟 Pusher 协议,本地跑一个 WebSocket 服务进程 - 别用
log或array驱动测试——它们连跨请求都做不到,纯属“假广播”
BROADCAST_DRIVER=pusher 时必须改 host 和 useTLS
即使你本地跑着 php artisan websockets:serve,Laravel 默认仍会把事件往 Pusher 官方服务器发。要让它打到本地服务,必须显式覆盖配置。
关键三处:
-
.env中设BROADCAST_DRIVER=pusher(不能是redis,否则跳过 Pusher 协议栈) -
config/broadcasting.php的connections.pusher.options.host改为127.0.0.1,端口设6001 -
connections.pusher.options.useTLS设为false,否则 Chrome 因自签名证书拒绝连接
漏掉任意一项,事件就停在 Laravel 进程里,根本不出去。
前端 Echo 订阅失败,先查 authEndpoint 和频道名大小写
调用 Echo.private('chat.123') 后卡住,90% 是鉴权接口 /api/broadcasting/auth 返回异常或格式不对。
- 确保
routes/channels.php里对应频道闭包返回true或含auth字段的数组,不能返回null、空数组或字符串 - 响应体必须是标准 JSON,且严格包含
auth字段,例如{"auth":"v8Z:Ym"};返回{"error":"unauthorized"}会导致前端静默失败 -
authEndpoint地址必须和 Laravel 应用域名、协议完全一致,http://localhost和https://yourdomain.com之间跨域会触发 CORS 或 404 - 频道名敏感:
chat.123和Chat.123是两个频道,private-chat.123和chat.123也完全不匹配
队列任务进度推送不能靠 dispatch() 主动推进度
dispatch(new ProcessJob($uuid)) 只是把任务塞进队列,它不执行、不感知进度、更不会自动广播。
正确做法是让任务自己“说话”:
- 任务执行中用
Redis::set("job:progress:{$uuid}", $percent)写状态(别用数据库主表,高并发下UPDATE会拖垮队列) - 同时触发广播事件:
broadcast(new JobProgressUpdated($uuid, $percent)),事件类需实现ShouldBroadcast - 频道必须是 public 类型(
return new Channel('progress.' . $uuid)),private/presence 需鉴权,不适合通用进度通道 - 前端订阅名必须和
broadcastOn()返回值逐字符一致:Echo.channel('progress.' + jobId)
频道名拼错一个点、大小写或类型(字符串 vs 数字),前端就收不到——这个细节在 Laravel 5.5 里尤其容易被忽略,因为错误不报异常,只静默丢弃。


















