Laravel广播事件通知可通过五种方式实现:一、Pusher驱动;二、Redis+Laravel Echo Server自建WebSocket;三、Soketi开源替代方案;四、自定义广播驱动;五、数据库队列降级保障。

如果您在Laravel应用中需要向客户端实时推送事件通知,例如用户收到新消息或订单状态更新,则需借助广播系统将事件从服务器端分发至前端。以下是实现Laravel广播事件通知的多种方法:
一、使用Pusher驱动配置广播通道
Pusher是一种托管式WebSocket服务,Laravel原生支持,适合快速启用实时广播功能。需注册Pusher账号获取密钥,并在Laravel中配置为广播驱动。
1、在config/broadcasting.php中将default值设为pusher。
2、在.env文件中设置BROADCAST_DRIVER=pusher,并填入PUSHER_APP_ID、PUSHER_APP_KEY、PUSHER_APP_SECRET和PUSHER_APP_CLUSTER。
3、运行composer require pusher/pusher-php-server安装Pusher SDK。
4、在前端JavaScript中引入pusher-js库,并使用PUSHER_APP_KEY与PUSHER_APP_CLUSTER初始化客户端实例。
5、监听指定频道(如private-user.123)上的事件(如App\Events\OrderShipped),触发回调函数处理通知。
二、使用Redis + Laravel Echo Server自建WebSocket服务
通过Redis作为广播事件的中间件,配合Laravel Echo Server搭建本地WebSocket服务,避免第三方依赖,适用于内网或对数据隐私要求高的场景。
1、在.env中设置BROADCAST_DRIVER=redis,并确保REDIS_URL可连接。
2、安装Node.js环境后执行npm install -g laravel-echo-server全局安装服务端。
3、运行laravel-echo-server init生成配置文件,将authHost设为当前应用域名,databaseConfig.redis.port匹配Redis端口。
4、启动服务:laravel-echo-server start。
5、前端引入laravel-echo和socket.io-client,配置broadcaster: 'socket.io'及host指向Echo Server地址。
6、使用private或presence频道订阅,并绑定事件名,接收广播载荷。
三、使用Soketi作为轻量级开源替代方案
Soketi是兼容Pusher协议的开源Node.js WebSocket服务器,无需配置复杂依赖,支持JWT鉴权与多租户,适合作为Pusher的零成本替换。
1、通过Docker运行Soketi:docker run -p 6001:6001 -e PUSHER_APP_ID=app-id -e PUSHER_APP_KEY=app-key -e PUSHER_APP_SECRET=app-secret quay.io/soketi/soketi:latest。
2、在.env中将BROADCAST_DRIVER=pusher保持不变,但修改PUSHER_APP_CLUSTER=mt1,PUSHER_HOST=127.0.0.1,PUSHER_PORT=6001,PUSHER_SCHEME=http。
3、确保config/broadcasting.php中Pusher配置的host、port、scheme与Soketi实例一致。
4、前端仍使用pusher-js,无需更改初始化代码,仅需确保连接地址指向本地Soketi服务。
5、触发Laravel事件时,框架自动将事件序列化并推送到Soketi,再由其转发至已认证的客户端连接。
四、使用自定义广播驱动对接原生WebSocket服务器
当需完全控制广播协议逻辑(如集成已有WebSocket集群或定制鉴权流程)时,可实现IlluminateBroadcastingBroadcastersBroadcaster接口,编写专属驱动。
1、创建类AppBroadcastingCustomWebSocketBroadcaster,继承Broadcaster并实现auth、validAuthenticationResponse和broadcast方法。
2、在config/broadcasting.php的connections中新增自定义驱动配置项,键名为custom-ws,值为对应类的完整命名空间。
3、将BROADCAST_DRIVER设为custom-ws。
4、在broadcast方法中,使用stream_socket_client或ReactPHP等工具连接目标WebSocket服务器,并按约定格式发送JSON帧(含channel、event、data字段)。
5、前端仍通过Laravel Echo连接,但需在初始化时指定broadcaster: 'custom-ws'并提供适配器JS逻辑。
五、使用数据库广播队列降级保障通知可达性
在WebSocket连接不可用或客户端离线时,将广播事件暂存至数据库表,待客户端重连后拉取未读通知,形成广播+轮询的混合模式。
1、执行php artisan notifications:table生成notifications迁移,运行migrate。
2、定义一个广播事件类,同时实现ShouldBroadcastNow与ShouldQueue接口,确保失败时进入队列。
3、在AppProvidersBroadcastServiceProvider中监听BroadcastException,捕获推送失败后调用Notification::send()将内容写入notifications表,目标为用户ID。
4、前端在建立Echo连接前,先发起HTTP请求/api/unread-notifications,返回created_at大于上次同步时间的通知列表。
5、每次成功接收广播事件后,记录最新last_broadcast_timestamp到localStorage,用于下一次拉取比对。


















