thinkphp 6.0 通过队列异步实现站内信推送,解耦业务与发送逻辑;采用轻量消息结构(含 to_user_id、type 等字段),基于 redis 队列投递 sendnoticejob 任务,支持失败重试与状态同步,前端通过接口读取并标记已读。

ThinkPHP 6.0 实现站内信队列推送,核心在于解耦发送逻辑与业务操作,用队列异步处理消息写入和通知分发,避免阻塞主流程。关键不是“立刻发”,而是“可靠地发”。
消息结构设计:轻量、可扩展
站内信本质是用户间或系统向用户的轻量通知,字段不宜过多。推荐基础结构:
- to_user_id:接收者 ID(支持单人/批量,可后续扩展为数组)
- from_user_id:发送者 ID(0 表示系统消息)
- title:消息标题(≤50 字)
- content:消息正文(支持 Markdown 或纯文本)
- type:类型标识(如 'system', 'comment', 'like'),便于前端分类展示
- link:跳转链接(如 '/post/123',空字符串表示无跳转)
- is_read:默认 0,查收后更新
- created_at:时间戳,由队列任务执行时写入
使用 TP6 内置队列:简单可靠
ThinkPHP 6.0 自带队列驱动(支持 Redis、Database、Amazon SQS 等),无需额外引入复杂中间件。以 Redis 为例:
- 确保已安装 phpredis 扩展,并在
config/queue.php中配置 Redis 连接 - 定义消息类
app/job/SendNoticeJob.php,实现think\queue\Job接口 - 在 job 的
handle()方法中完成:查用户、写入notice表、触发 WebSocket 或轮询提示(可选) - 投递队列:
dispatch(new SendNoticeJob($data)),$data 是上面定义的消息结构数组
业务层调用:只管“发”,不管“怎么发”
控制器或服务类中,把消息组装好直接投递,不关心是否成功入库或是否在线:
// 示例:用户评论后通知作者
$data = [
'to_user_id' => $post['author_id'],
'from_user_id' => $user['id'],
'title' => '你的文章被评论了',
'content' => mb_strimwidth($comment['text'], 0, 30, '…'),
'type' => 'comment',
'link' => '/post/'.$post['id'].'#comment-'.$comment['id']
];
dispatch(new SendNoticeJob($data)); // 异步执行,立即返回
这样主流程响应快,失败重试由队列机制保障,日志可记录投递状态用于排查。
前端查看与标记:读取 + 状态同步
站内信列表页通过接口查 notice 表(按 to_user_id 和 is_read 查询),前端点击某条消息时调用:
- API 接口如
POST /api/notice/read,传id,后端执行Db::name('notice')->where('id', $id)->update(['is_read' => 1]) - 未读数可用缓存(如 Redis)单独维护:
INCR user:{$uid}:notice:unread,每次发信 +1,标记已读 -1 - 首页小红点等实时性要求高的场景,配合 ThinkPHP 的事件或自定义 WebSocket 通知(非必须,队列本身不负责实时推送)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











