实时推送
2026/10/26大约 1 分钟
实时推送
基于 webman/push(WebSocket)。app/service/PushService.php 提供下发 API,app/basic/ChannelAuthRegistry.php 管控订阅鉴权。
服务端点
WebSocket 与鉴权 HTTP 端口由 webman/push 配置提供(默认 ws 3131、api 3232)。前端建立连接后按频道订阅,服务端向频道/用户推送事件。
下发
PushService::toChannel($channel, $event, $data); // 向频道广播,失败记日志返 false
PushService::toUser($sid, $event, $data); // 走私有频道 private-sid_{sid}PushService::registerAsChannel() 会把 push 注册成 NotifyService 的一个通知通道 'push'(skip_preference=true),于是"发通知"和"实时推送"打通:模板选 push 通道即可直达在线客户端。
频道鉴权
ChannelAuthRegistry::authorize($pattern, $checker, $owner) 用 fnmatch 匹配频道名(如 private-sid_*),$checker 返回 true 允许 / false 拒绝 / null 交下一个。默认策略:private-sid_{sid} 仅本人可订阅,其它频道放行。前缀常量 PRIVATE_USER_PREFIX = 'private-sid_'。
插件加自定义频道鉴权一律带 owner,卸载时 forgetByOwner 反清。详见身份与鉴权扩展、队列·任务·推送。
特性开关
推送受 push_enabled(默认 true)控制,见 config/plugin_extend.php。
尽力而为
toChannel/toUser 失败返回 false 并记日志,不抛异常。业务别把"已推送"当强一致前提,关键状态仍应落库或走通知中心。
