通义千问api无状态,对话记录不会自动保存;php 8.3中需在应用层主动实现存储:一、本地utf-8文本追加写入;二、插入mysql/postgresql结构化入库;三、生成标准json文件供离线分析或rag接入。

PHP 8.3 对接通义千问时,对话记录不会自动保存——API 调用本身是无状态的,每次请求只返回结果,不落库、不同步、不归档。要实现可靠存储,需在你的 PHP 应用层主动设计写入逻辑,结合业务场景选择轻量存档或结构化入库。
一、最简方式:写入本地 UTF-8 文本文件
适合开发调试、临时留痕、无需检索的单次会话归档。
- 调用 API 得到响应后,拼装时间戳、用户输入、AI 输出为结构化文本,例如:
[2026-10-01 17:05:22] 用户:如何用 PHP 连接 MySQL?
[2026-10-01 17:05:24] 千问:使用 PDO 或 mysqli 扩展…… - 用
file_put_contents($path, $content, FILE_APPEND | LOCK_EX)追加写入,确保多进程安全; - 文件名建议含日期和会话标识,如
qwen_log_20261001.txt; - 务必指定
mb_internal_encoding('UTF-8')并用mb_convert_encoding()统一编码,避免中文乱码。
二、推荐方式:插入 MySQL / PostgreSQL 数据表
适合生产环境,支持按用户、会话 ID、关键词检索,可关联业务数据(如订单号、客服工单)。
- 建表字段建议至少包含:
id(自增主键)、session_id(UUID 或业务流水号)、role('user'/'assistant')、content(TEXT)、created_at(DATETIME,默认 CURRENT_TIMESTAMP); - 一次对话含多轮交互,每条消息单独 insert 一行,保持原子性;
- PHP 中使用 PDO 预处理语句插入,防止 SQL 注入:
$stmt = $pdo->prepare("INSERT INTO qwen_logs (session_id, role, content, created_at) VALUES (?, ?, ?, NOW())");<br>$stmt->execute([$sessionId, 'user', $userInput]); - 若需全文检索,MySQL 可为
content字段添加 FULLTEXT 索引,PostgreSQL 可用tsvector。
三、进阶方式:写入 JSON 文件 + 定期导入知识库
适合需要导出备份、做离线分析,或对接内部 RAG 系统的团队。
- 将单次完整对话(含多轮 message 数组)组装为标准 JSON:
["messages" => [["role"=>"user","content"=>"…"],["role"=>"assistant","content"=>"…"]], "timestamp" => "2026-10-01T17:05:22+08:00"]; - 用
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)格式化输出; - 保存为
qwen_session_{uniqid()}.json,每日归档进/storage/qwen/20261001/目录; - 后续可用 Python 脚本批量解析这些 JSON,导入 Elasticsearch 或向量化存入 Chroma。
四、注意避开几个坑
- 不要依赖 $_SESSION 存储对话历史——PHP session 默认不持久,重启服务或超时即丢失;
- 不要把 API 响应直接 echo 给前端后再靠 JS 复制保存——不可靠、易截断、无时间戳;
- 避免在循环中频繁 fopen/fwrite 文本文件——改用缓冲写入或日志组件(如 Monolog);
- 若使用百炼平台的流式接口(stream=true),需在回调函数中分段接收并拼接 content,再统一写入,否则可能漏掉中间片段。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











