tp6消息推送核心是可靠触达而非实时弹窗:队列实现解耦式站内信(如系统通知),gatewayworker支撑秒级在线推送(如聊天),think-worker提供轻量websocket方案;前后端通过标准api协同,确保职责清晰、状态可控。

TP6 接口消息推送的核心不是“实时弹窗”,而是“可靠触达”——业务触发后,把通知交由队列或通道异步投递,避免阻塞主流程,同时保障失败可重试、状态可追踪。
用队列实现解耦式站内信推送
适合系统通知、评论提醒、审核结果等非强实时场景。关键在于把“发消息”变成一个轻量数据投递动作:
- 定义标准消息结构:包含 to_user_id(接收人)、type(如 'system'/'order')、title、content、link(跳转路径)等字段,不存冗余数据
- 控制器中只调用
dispatch(new SendNoticeJob($data)),立刻返回,不查库、不连 WebSocket - 在
app/job/SendNoticeJob.php的handle()方法里完成实际写库(插入notice表)、记录日志、触发前端轮询提示等逻辑 - 失败自动重试(TP6 队列默认 3 次),也可配置
maxTries和backoff控制间隔
用 GatewayWorker 实现实时在线推送
适合聊天、订单状态变更、管理员待办等需秒级送达的场景,依赖长连接:
- 通过
composer require workerman/gatewayclient安装客户端,在 TP6 中调用GatewayClient::sendToUid($uid, $message) - 服务端需独立部署 GatewayWorker(含 Register、Gateway、BusinessWorker),监听
1236(Gateway)和1238(Register)等端口 - 用户登录时调用
GatewayClient::bindUid($socket_client_id, $uid)绑定身份,登出时解绑 - 推送前先查
GatewayClient::isOnline($uid),避免向离线用户发无效消息
用 Think-Worker 搭建轻量 WebSocket 服务
适合中小项目快速接入,无需额外部署 GatewayWorker:
- 执行
php think worker:server启动服务,默认监听ws://0.0.0.0:2345 - 自定义
app/service/Push.php,在onMessage中解析指令,例如收到{"action":"push","uid":1001,"msg":"新订单"}就调用$this->sendMessageByUid(1001, ...) - 前端使用原生 WebSocket 或
uni.connectSocket连接,发送心跳包(如每 30 秒发"ping")维持连接 - 注意设置
onClose回调清理用户连接状态,防止内存泄漏
接口设计与前端协同要点
后端提供两个基础 API,与推送机制无关,保持职责清晰:
-
GET /api/notice/list:按
to_user_id和is_read查询未读/全部消息,返回分页列表 -
POST /api/notice/read:传
id或ids[]批量标记已读,更新数据库is_read = 1 - 前端在进入消息页时拉取一次列表;点击某条时立即调用 read 接口,并本地更新 UI,不依赖推送回执
- 所有推送内容必须带
type字段,前端据此决定图标、声音、跳转逻辑,避免硬编码











