客服说昨天有个用户投诉,想翻聊天记录,后台会话列表是空的,数据库里那张会话消息表 0 行。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

INSERT INTO cs_messages (session_id, sender, content, created_at)
VALUES (1024, 'user', '退款什么时候到', NOW());
SELECT * FROM cs_messages WHERE session_id = 1024 ORDER BY id;

消息只推进前端数组,靠页面不刷新维持,后端只在会话结束时整段提交一次。用户关掉窗口就不会触发结束事件,这段对话从来没写进库。这一点先确认清楚,后面就不用反复试。

碰到「会话记录未落库」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,改成每条消息到达就落库,前端拿到 message_id 再渲染;会话表加开始时间和最后消息时间,方便按时间翻;写一个定时任务归档三十天前的会话,别让单表无限涨。

改完照着核一遍,随便发两条消息,刷新页面后历史还在,库里也能按 session_id 查出来。

作者 9823189