Laravel Reverb 正常推送实时消息需确保广播系统、事件生命周期、前端连接三者完全对齐;须配置 BROADCAST_DRIVER=reverb、启用 BroadcastServiceProvider、启动 Reverb 服务、定义 ShouldBroadcast 事件、前端用 Echo 直连 ws:// 并严格匹配频道名。

要让 Laravel Reverb 正常推送实时消息,核心不是“配完就能用”,而是确保广播系统、事件生命周期、前端连接三者完全对齐。任一环节错位,都会静默失败——比如事件发了但前端收不到,或连接成功却监听不到频道。
确认基础服务与驱动已启用
Reverb 不是插件式组件,它依赖 Laravel 广播系统的完整链路。先检查关键配置是否真正生效:
- BROADCAST_DRIVER=reverb 必须唯一存在,删掉 .env 中任何其他 BROADCAST_DRIVER=redis 或 pusher 的残留行
- 运行
php artisan tinker,输入config('broadcasting.connections.reverb'),确认返回非 null 配置数组 - 若返回 null,补运行
php artisan vendor:publish --provider="Laravel\Reverb\ReverbServiceProvider" --tag="reverb-config"生成 config/reverb.php - 确保
App\Providers\BroadcastServiceProvider::class已显式添加到 config/app.php 的 providers 数组中(不能只靠自动发现)
启动并验证 Reverb 服务
Reverb 默认监听 127.0.0.1:8080,但它不会自动换端口,也不会把错误输出到终端——失败时只显示 “Command failed”。
- 启动前查端口占用:
lsof -i :8080(Mac/Linux)或netstat -ano | findstr :8080(Windows) - 确保
storage/logs/reverb.log所在目录可写(注意是目录权限,不是文件) - 运行
php artisan reverb:start;成功时输出类似Starting Reverb server on ws://localhost:8080 - 如遇 fork 失败,运行
php -r "echo function_exists('pcntl_fork') ? 'yes' : 'no';"检查 Swoole 环境支持
定义可广播事件并触发
事件必须真正进入广播流程,而不仅是实现接口。常见卡点是队列未启用或驱动不匹配。
- 创建事件:
php artisan make:event ChatMessageSent --broadcast - 在事件类中实现
ShouldBroadcast,并返回频道,例如:return new Channel('chat'); - 确保
BROADCAST_CONNECTION=redis在 .env 中设置(Reverb 仍需 Redis 作为消息中转) - 触发事件时用
event(new ChatMessageSent($user, $message)),不要用 dispatch() —— 广播事件走的是广播通道,不是队列通道 - 可在 tinker 中执行该 event,然后查看 storage/logs/laravel.log 是否出现
Broadcasting [ChatMessageSent] on channels ["chat"]
前端 Echo 连接与监听
Reverb 是纯 WebSocket 服务器,不处理 HTTP 请求。Echo 必须直连 ws/wss 地址,且配置严格匹配后端。
- 初始化 Echo 时,broadcaster 必须为 'reverb',不是 'pusher' 或 'socket.io'
- 开发环境示例:
const echo = new Echo({<br> broadcaster: 'reverb',<br> wsHost: window.location.hostname,<br> wsPort: 8080,<br> forceTLS: false,<br> disableStats: true<br> }); - 监听频道需与后端
broadcastOn()返回值一致,大小写敏感:echo.channel('chat').listen(...) - 若用私有频道(如
new PrivateChannel('chat.' . $roomId)),必须配置routes/channels.php授权逻辑,否则返回 403 - 前后端 host 必须统一:APP_URL=http://localhost 时,前端不能跑在 http://127.0.0.1:3000,浏览器会因 host 不一致拒绝 WebSocket 连接


















