Laravel中如何实现广播推送功能_Laravel Broadcasting与Pusher配置【深入】

12次阅读

laravel 官方已弃用 Pusher,主推自托管的 laravel/reverb;若仍用 Pusher,需手动配置 v2 认证头、正确路由、频道鉴权及用户上下文传递,并注意 Reverb 的部署与跨域限制。

Laravel中如何实现广播推送功能_Laravel Broadcasting与Pusher配置【深入】

Pusher 不再是 Laravel 广播的默认或推荐方案,官方已转向 laravel/reverb 作为首推的自托管广播服务器;若仍需用 Pusher,必须手动配置并注意其 API v1 已停用、v2 的认证机制和事件命名规则变更。

为什么 pusher-php-server v7+ 无法通过 authEndpoint 验证?

Pusher v2 要求所有私有/存在频道的鉴权请求必须携带 X-Pusher-KeyX-Pusher-Socket-ID 头,并返回严格格式的 jsON(含 auth 字段),而旧版 Laravel 的 Broadcast::routes() 默认不校验这些头。

  • 确保在 routes/channels.php 中显式启用鉴权路由
    Broadcast::routes(['middleware' => ['web', 'auth:sanctum']]);
  • config/broadcasting.phppusher 配置中,host 必须设为 api-region.pusher.com(如 api-us2.pusher.com),不能用 ws-*.pusher.com
  • 前端初始化时,authEndpoint 必须指向 Laravel 的 /broadcasting/auth,且该端点需返回形如 {"auth":"v1...:..."} 的响应,不能多字段、不能带空格

Broadcast::channel() 回调里 $user 为什么是 NULL

因为 Sanctum 或 Passport 的中间件未正确传递用户上下文到广播通道闭包——Laravel 广播鉴权不走常规 http 请求生命周期,而是复用当前会话或 Token,但默认不自动解析。

  • 确认 config/broadcasting.phpdefault 已设为 pusher,且 connections.pusher.options.cluster 与 Pusher 控制台一致(如 us2
  • app/Providers/BroadcastServiceProvider.phpboot() 方法中,显式绑定用户解析逻辑:
    Broadcast::channel('chat.{roomId}', function ($user, $roomId) {     return $user && $user->can('view', Room::findOrFail($roomId)); });
  • 若使用 Sanctum,确保请求携带有效的 Authorization: Bearer {token},且该 token 已关联用户;web 中间件对广播鉴权无效,必须用 auth:sanctum

如何让 Reverb 替代 Pusher 实现零成本广播?

Reverb 是 Laravel 官方维护的高性能、纯 PHP 广播服务器,无需第三方服务,但需额外启动进程,且不兼容 Pusher 的客户端 SDK 兼容层(除非启用 pusher 兼容模式)。

  • 安装:
    composer require laravel/reverb
  • 发布配置:
    php artisan vendor:publish --provider="LaravelReverbReverbServiceProvider" --tag="reverb-config"
  • 启动服务:
    php artisan reverb:start

    ,并确保 BROADCAST_CONNECTION=reverb.env 中生效

  • 前端改用 Reverb 客户端:
    import { createClient } from 'laravel-reverb';  const reverb = createClient({     key: import.meta.env.vite_REVERB_APP_KEY,     wsHost: import.meta.env.VITE_REVERB_HOST,     wsPort: import.meta.env.VITE_REVERB_PORT || 8080,     wssPort: import.meta.env.VITE_REVERB_ssl_PORT || 443,     forceTLS: (import.meta.env.VITE_REVERB_SCHEME || 'https') === 'https', });

真正麻烦的是跨域和 HTTPS 场景下的 websocket 连接:Reverb 默认只监听 localhost,生产环境必须配置 REVERB_HOST=your-domain.com 并反向代理 WebSocket 流量;Pusher 则天然规避此问题,但代价是费用和厂商锁定。

text=ZqhQzanResources