Reverb适合Laravel 10.28+本地开发及有运维能力的生产环境,因其是官方维护、深度集成广播系统、基于Swoole启动快且内存占用低;默认推荐它因开箱即用、无需额外服务、配置简洁。

直接说结论:本地开发用 reverb,小团队上线用 redis + laravel-websockets 或 soketi,高稳定性要求或无运维能力直接上 pusher。
Reverb 适合什么场景?为什么 Laravel 10+ 默认推荐它?
Reverb 是 Laravel 官方维护的 WebSocket 服务器,不是第三方封装,和广播系统深度耦合。它用 Swoole 处理连接,启动快、内存占用低、无需额外服务进程管理。
- 只支持 Laravel 10.28+(低于此版本装了也跑不起来)
- 默认监听
http://localhost:8080,前端 Echo 配置里broadcaster设为'reverb',host和port必须显式写对,否则连不上 - 不支持 TLS 直连,生产环境必须配 Nginx 反向代理并终止 HTTPS,否则浏览器会报
WebSocket connection to 'wss://...' failed - 私有频道认证走
/api/broadcasting/auth,这个路由要确保在routes/api.php中启用且未被中间件拦截
Redis + laravel-websockets / soketi 怎么选?关键差异在哪?
两者都依赖 Redis 存储连接状态和事件队列,但运行时行为不同:soketi 更轻量、配置少;laravel-websockets 提供 Web 管理界面和更细粒度的连接控制。
-
laravel-websockets的stats端点(如/laravel-websockets)默认开启,暴露连接数、频道活跃度,适合调试但上线前建议关掉或加 auth -
soketi启动后默认不带管理界面,需手动加--dashboard参数;它的authEndpoint默认是/broadcasting/auth,而 laravel-websockets 是/laravel-websockets/auth,Echo 配置里容易填错 - Redis 连接超时设置很重要:如果
databaseConfig.redis.timeout小于 5 秒,在高并发下会出现Connection closed before receiving a handshake response - 别在 .env 里写
REDIS_URL=redis://...然后又在config/database.php里重复配 host/port —— Laravel 会优先读 URL,另一套配置实际失效
Pusher 为什么还在用?哪些坑新手最容易踩?
Pusher 不是“过时”,而是“省心”。它解决的是你不想管连接保活、证书更新、集群扩缩容的问题。但代价是每秒连接数和消息量计费,以及调试黑盒化。
- 错误信息全是
404 Not Found或401 Unauthorized,但真实原因可能是:PUSHER_APP_CLUSTER填错(比如填成mt1却用了us2区域)、encrypted设为true却没开 TLS、或者前端key混淆了APP_KEY - 私有频道认证失败时,Pusher 控制台不会显示具体哪条请求被拒,只能靠 Laravel 日志里的
Illuminate\Broadcasting\BroadcastException定位 - 测试阶段别用
cluster=mt1—— 这是免费版唯一可用 cluster,但延迟高、连接不稳定;开发时切到us2或ap2更准 - 前端调用
Echo.private('user.' + userId)时,如果userId是 null 或空字符串,会发请求到/broadcasting/auth?channel_name=user.,后端路由匹配失败直接 404,而不是抛出认证异常
最常被忽略的一点:所有驱动都依赖队列正常工作。如果你用 sync 驱动测试广播,事件能推但完全不走 WebSocket;换成 redis 或 database 后,忘了跑 php artisan queue:work,就会卡在“事件触发了,但前端收不到”——先盯紧 storage/logs/laravel.log 里有没有 Failed to broadcast event 才是正解。



















