Laravel WebSockets 非开箱即用,需正确配置广播驱动、频道权限及反向代理头;单独运行 websockets:serve 不会自动转发事件,必须切 BROADCAST_DRIVER=pusher、配好 auth 鉴权与 Nginx/Apache 透传 Upgrade/Connection 头,并确保队列进程消费 ShouldBroadcast 事件。

直接说结论:Laravel WebSockets(laravel-websockets)不是开箱即用的“WebSocket服务器”,它必须配合 Laravel 广播系统 + 正确的前端订阅逻辑才能工作;单独运行 php artisan websockets:serve 后,前端连不上、收不到事件,90% 是因为广播驱动没切对、频道权限没配好,或 Nginx/Apache 没透传 WebSocket 协议头。
为什么 php artisan websockets:serve 启动了却没反应
这个命令只启动了 Laravel WebSockets 自带的 WebSocket 服务进程,但它不自动接管 Laravel 的广播事件——你得手动把广播驱动从 log 或 array 切到 pusher,并指向本地服务地址。
-
BROADCAST_DRIVER=pusher必须写在.env中,不能是redis或log -
config/broadcasting.php里connections.pusher.options.host要设为127.0.0.1(或部署机内网 IP),port设为6001(默认) -
options.useTLS在本地开发时建议设为false,否则浏览器会因自签名证书拒绝连接 - Nginx/Apache 反向代理必须显式透传
Upgrade和Connection头,否则握手失败,控制台只报WebSocket connection to 'ws://...' failed
PrivateChannel 订阅一直卡在 connecting 状态
前端调用 Echo.private('user.123') 时,Laravel 会自动发 POST 请求到 /api/broadcasting/auth 鉴权。这个请求失败,前端就永远停在 connecting。
- 确保
App\Providers\BroadcastServiceProvider在config/app.php的providers数组中已启用(取消注释) -
routes/channels.php中对应频道的闭包必须返回true或包含auth字段的数组,不能只返回空数组或字符串 - 该路由响应体必须是 JSON 格式,且含
auth字段,例如:{"auth":"v8Z...:Ym..."};返回{"error": "unauthorized"}会导致前端静默失败 - 前端
authEndpoint地址要和 Laravel 应用域名一致,跨域或协议不匹配(如前端用http://,后端authHost配了https://)会触发 CORS 或 404
前端用 Echo.channel() 收不到事件
频道名拼写、大小写、类型必须和事件类 broadcastOn() 返回值**逐字符一致**,差一个点或空格都不行。
- 事件类里写的是
return new Channel('chat'),前端就必须用Echo.channel('chat'),不能是chat-room或'Chat' - 如果事件返回
new PrivateChannel('user.' . $userId),前端必须用Echo.private('user.123'),且$userId类型要统一(int vs string) - 事件类需实现
ShouldBroadcast,且broadcastAs()返回的事件名(如'message.sent')要和前端.listen('message.sent', ...)完全匹配 - 别在本地开发时用
php artisan serve测试 WebSocket——它不支持长连接升级,必须走 Nginx/Apache 或直接访问http://localhost:8000(若已配置反代)
最常被忽略的是:Laravel WebSockets 不处理队列,它只负责转发广播事件;所有 ShouldBroadcast 事件仍需由 queue:work 进程消费并推送到 WebSocket 服务。漏掉这步,事件根本不会发出。


















