乐于分享
好东西不私藏

6.Spring AI 聊天记忆与会话管理:让对话有连续性

6.Spring AI 聊天记忆与会话管理:让对话有连续性

本文是 Spring AI Agent 开发学习系列的第 6 篇

开篇

你是否遇到过这样的场景?

  • • 用户说:"我叫张三"
  • • 模型回复:"你好张三!"
  • • 用户追问:"我叫什么名字?"
  • • 模型回答:"抱歉,我不知道您的名字..."

这就是无记忆对话的典型问题。每次请求都是独立的,模型无法记住之前说过的话。

今天我们来解决这个问题——让 AI 模型拥有"记忆"。

读完本文,你将收获:

  • • ✅ ChatMemory 核心概念与工作原理
  • • ✅ MessageWindowChatMemory 的窗口机制
  • • ✅ MessageChatMemoryAdvisor 的正确配置
  • • ✅ 多用户会话管理实践
  • • ✅ 记忆持久化策略对比

一、为什么需要 ChatMemory?

1.1 HTTP 的"无状态"困境

REST API 天生是无状态的:

请求1: "我叫张三" → 模型不知道任何历史 → 回复"你好张三"请求2: "我叫什么?" → 模型不知道任何历史 → 回复"我不知道"

模型每次看到的只有当前用户输入,没有任何上下文。

1.2 ChatMemory 的解决方案

ChatMemory 的核心思路很简单:

请求到来时:  1. 从存储中获取该用户的历史对话  2. 将历史消息作为 context 附加到当前请求  3. 模型看到完整对话历史,做出连贯回复请求完成后:  4. 将本轮对话保存回存储

这样模型就能"记住"之前说过的话。

二、ChatMemory 核心组件

Spring AI 提供了清晰的组件分层:

┌─────────────────────────────────────────────────────────────┐│ MessageChatMemoryAdvisor                                    ││ (请求拦截器,自动管理记忆的加载和保存)                        │└─────────────────────────────────────────────────────────────┘                            ↓ 操作┌─────────────────────────────────────────────────────────────┐│ ChatMemory 接口                                              ││ add() / get() / clear() — 按会话ID管理消息历史                 │└─────────────────────────────────────────────────────────────┘                            ↓ 实现┌─────────────────────────────────────────────────────────────┐│ MessageWindowChatMemory                                      ││ (滑动窗口,只保留最近N条消息,避免token超限)                  │└─────────────────────────────────────────────────────────────┘                            ↓ 存储┌─────────────────────────────────────────────────────────────┐│ ChatMemoryRepository                                         ││ InMemoryChatMemoryRepository / Redis / Database...           │└─────────────────────────────────────────────────────────────┘

2.1 ChatMemory 接口

核心操作就三个方法:

public interface ChatMemory {    void add(String conversationId, List<Message> messages);  // 添加消息    List<Message> get(String conversationId, int lastN);      // 获取最近N条    void clear(String conversationId);                        // 清空会话}

2.2 MessageWindowChatMemory

最常用的实现,带滑动窗口:

MessageWindowChatMemory memory = MessageWindowChatMemory.builder()    .chatMemoryRepository(repository)  // 指定存储    .maxMessages(20)                  // 只保留最近20条    .build();

为什么要限制消息数量?

  1. 1. Token 限制:每条消息都占用 token,无限累积会超限
  2. 2. 成本控制:每次请求的历史消息越多,API 调用成本越高
  3. 3. 相关性:过久的消息通常与当前话题无关

2.3 ChatMemoryRepository 存储选项

存储类型
特点
适用场景
InMemoryChatMemoryRepository
内存存储,重启丢失
开发测试、短期会话
Redis
持久化、分布式支持
生产环境、多实例部署
Database
关系型存储、可查询
需要审计、分析历史对话

三、MessageChatMemoryAdvisor 配置

3.1 Advisor 的作用

MessageChatMemoryAdvisor 是一个请求拦截器,在请求前后自动处理记忆:

Before Request:    → 从 ChatMemory 获取历史消息    → 附加到当前请求的 contextAfter Response:    → 将本轮对话(用户提问+模型回复)保存到 ChatMemory

3.2 配置方式

@Configurationpublic class MemoryConfig {    @Bean    public ChatMemory chatMemory() {        return MessageWindowChatMemory.builder()            .chatMemoryRepository(new InMemoryChatMemoryRepository())            .maxMessages(20)            .build();    }    @Bean    public MessageChatMemoryAdvisor memoryAdvisor(ChatMemory chatMemory) {        return MessageChatMemoryAdvisor.builder(chatMemory).build();    }}

3.3 关键参数:chat_memory_conversation_id

这是最容易踩坑的地方!

Advisor 需要知道哪个会话的记忆。参数名必须是:

chat_memory_conversation_id

很多人以为是 conversationId,结果报错:

java.lang.IllegalArgumentException: conversationId cannot be null

正确用法:

chatClient.prompt()    .user("我叫张三")    .advisors(a -> a.param("chat_memory_conversation_id", "user-123"))    .call()    .content();

四、实战代码:有记忆 vs 无记忆对比

4.1 控制器设计

我们设计两个对比端点:

@RestController@RequestMapping("/api/memory")public class MemoryController {    private final ChatClient chatClientWithMemory;    private final ChatClient chatClientNoMemory;    public MemoryController(ChatModel chatModel, MessageChatMemoryAdvisor memoryAdvisor) {        // 无记忆客户端:独立builder,无advisor        this.chatClientNoMemory = ChatClient.builder(chatModel).build();        // 有记忆客户端:添加默认advisor        this.chatClientWithMemory = ChatClient.builder(chatModel)            .defaultAdvisors(memoryAdvisor)            .build();    }}

注意:两个客户端必须用独立的 builder,否则 advisor 会"泄露"到无记忆客户端。

4.2 无记忆端点

@GetMapping("/no-memory")public String noMemory(@RequestParam String message) {    return chatClientNoMemory.prompt()        .user(message)        .call()        .content();}

每次请求都是独立的,模型不记住任何历史。

4.3 有记忆端点

@GetMapping("/chat")public String chatWithMemory(        @RequestParam(required = false) String sessionId,        @RequestParam String message) {    // 自动生成会话ID(如果未提供)    String sid = (sessionId != null && !sessionId.isBlank())            ? sessionId : UUID.randomUUID().toString().substring(0, 8);    String result = chatClientWithMemory.prompt()        .user(message)        .advisors(a -> a.param("chat_memory_conversation_id", sid))        .call()        .content();    return "[" + sid + "] " + result;}

关键点:

  • • 用 sessionId 区分不同用户的会话
  • • 每次请求带上 chat_memory_conversation_id 参数
  • • Advisor 自动加载该会话的历史消息

4.4 测试对比

无记忆测试:

# 第一句curl "http://localhost:8085/api/memory/no-memory?message=我的名字是张三"# 输出:你好,张三!很高兴认识你。# 第二句(模型不记得)curl "http://localhost:8085/api/memory/no-memory?message=我叫什么名字?"# 输出:作为一个人工智能助手,我无法知道您的真实姓名...

有记忆测试:

# 创建会话curl "http://localhost:8085/api/memory/new"# 输出:{"sessionId": "36e0ca99", ...}# 第一句(自我介绍)curl "http://localhost:8085/api/memory/chat?sessionId=36e0ca99&message=我叫张三,是一名Java开发者"# 输出:[36e0ca99] 你好,张三!很高兴认识你...# 第二句(模型记得!)curl "http://localhost:8085/api/memory/chat?sessionId=36e0ca99&message=我叫什么名字?"# 输出:[36e0ca99] 你叫张三。刚才你自我介绍时提到了这一点。# 第三句(模型还记得!)curl "http://localhost:8085/api/memory/chat?sessionId=36e0ca99&message=我的工作是什么?"# 输出:[36e0ca99] 你是一名Java开发者...

完美!模型能记住整个对话历史。

五、会话管理

5.1 会话生命周期

会话管理流程
创建会话 → 使用会话(多次对话) → 清理会话

实现简单的会话管理:

private final Map<String, String> sessionStore = new ConcurrentHashMap<>();// 创建新会话@GetMapping("/new")public Map<String, String> newSession() {    String sessionId = UUID.randomUUID().toString().substring(0, 8);    sessionStore.put(sessionId, sessionId);    return Map.of("sessionId", sessionId, "message", "会话已创建");}// 列出活跃会话@GetMapping("/sessions")public Map<String, Object> listSessions() {    return Map.of("activeSessions", sessionStore.size(), "sessions", sessionStore.keySet());}// 清理会话@GetMapping("/clear")public Map<String, String> clearSession(@RequestParam String sessionId) {    String removed = sessionStore.remove(sessionId);    if (removed != null) {        return Map.of("status", "cleared", "sessionId", sessionId);    }    return Map.of("status", "not_found", "sessionId", sessionId);}

5.2 会话清理的重要性

虽然 ChatMemory 有滑动窗口限制,但仍需手动清理:

  1. 1. 隐私合规:用户数据到期后应删除
  2. 2. 存储成本:长期累积的会话占用存储空间
  3. 3. 性能影响:历史消息越多,每次请求处理越慢

六、持久化策略

6.1 InMemoryChatMemoryRepository 的局限

new InMemoryChatMemoryRepository()

优点:简单、零依赖

缺点:

  • • 应用重启后所有记忆丢失
  • • 多实例部署时无法共享
  • • 内存占用无上限

6.2 Redis 持久化(推荐生产使用)

Spring AI 提供了 Redis 支持:

@Beanpublic ChatMemoryRepository chatMemoryRepository(RedisTemplate<String, String> redisTemplate) {    return new RedisChatMemoryRepository(redisTemplate);}

特点:

  • • 持久化存储
  • • 分布式支持
  • • 可设置 TTL 自动过期

6.3 自定义持久化

实现 ChatMemoryRepository 接口即可对接任意存储:

public interface ChatMemoryRepository {    List<String> getConversationIds();    void add(String conversationId, String messageJson);    List<String> get(String conversationId);    void clear(String conversationId);}

可以对接 MySQL、PostgreSQL、MongoDB 等。

七、完整项目结构

module-04-memory/01-chat-memory/├── src/main/java/com/ai/hub/memory/│   ├── MemoryConfig.java       # ChatMemory + Advisor 配置│   ├── controller/│   │   └── MemoryController.java  # 有记忆/无记忆对比端点│   └── MemoryApplication.java  # 启动类├── src/main/resources/│   └── application.yml         # SiliconFlow API 配置└── pom.xml                     # spring-ai-client-chat 依赖

7.1 配置文件

spring:  ai:    openai:      api-key: ${AI_API_KEY}      base-url: https://api.siliconflow.cn/v1      chat:        options:          model: Qwen/Qwen3-8Bserver:  port: 8085

7.2 所有端点汇总

端点
功能
示例
/api/memory/no-memory
无记忆对话
?message=我叫张三
/api/memory/chat
有记忆对话
?sessionId=xxx&message=你好
/api/memory/new
创建新会话
-
/api/memory/sessions
活跃会话列表
-
/api/memory/clear
清理会话
?sessionId=xxx
/api/memory/info
接口说明
-

八、最佳实践

8.1 会话 ID 设计

推荐格式:

// 用户维度String sessionId = "user-" + userId;// 业务维度String sessionId = "order-" + orderId;// 时间维度String sessionId = "user-" + userId + "-" + DateUtils.formatDate(new Date(), "yyyyMMdd");

8.2 消息窗口大小选择

场景
建议 maxMessages
简单问答
5-10
复杂对话
20-30
长期对话(客服)
50-100

原则:够用即可,不要过大

8.3 记忆清理时机

  • • 用户主动退出时立即清理
  • • 设置会话 TTL(Redis 方案)
  • • 定期清理过期会话(数据库方案)

九、总结

今天我们掌握了 Spring AI 的对话记忆机制:

知识点
核心要点
ChatMemory
按会话ID管理消息历史的三操作接口
MessageWindowChatMemory
滑动窗口,避免 token 超限
MessageChatMemoryAdvisor
自动加载/保存记忆的拦截器
chat_memory_conversation_id
必须用这个名字传递会话ID
存储选择
InMemory(开发) → Redis(生产)

最易踩坑:参数名写错导致 advisor 找不到会话ID。

十、下篇预告

下一篇我们将深入 Advisor 机制:

  • • 自定义 Advisor 实现请求拦截
  • • 多 Advisor 组合使用
  • • Advisor 的执行顺序与依赖关系
  • • SafeGuardAdvisor 安全防护

敬请期待《第7篇:Advisor 机制与请求拦截》。

代码验证

本文所有代码已验证通过:

===== 无记忆测试 =====第一句:"我的名字是张三" → "你好,张三!"第二句:"我叫什么名字?" → "我无法知道您的真实姓名"===== 有记忆测试 =====Session: 36e0ca99第一句:"我叫张三,是一名Java开发者" → 模型记录第二句:"我叫什么名字?" → "你叫张三" ✓第三句:"我的工作是什么?" → "你是一名Java开发者" ✓清理会话 → 成功 ✓

Spring AI Agent 开发学习系列 - 第6篇

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-11 12:46:12 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/881432.html
  2. 运行时间 : 0.276021s [ 吞吐率:3.62req/s ] 内存消耗:4,953.34kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=246e9dee3e520d0652a35244d0d0ad3c
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 4.22 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.11 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001079s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001619s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000805s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000612s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001452s ]
  6. SELECT * FROM `set` [ RunTime:0.000535s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001557s ]
  8. SELECT * FROM `article` WHERE `id` = 881432 LIMIT 1 [ RunTime:0.019779s ]
  9. UPDATE `article` SET `lasttime` = 1786423572 WHERE `id` = 881432 [ RunTime:0.008295s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000928s ]
  11. SELECT * FROM `article` WHERE `id` < 881432 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001168s ]
  12. SELECT * FROM `article` WHERE `id` > 881432 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002880s ]
  13. SELECT * FROM `article` WHERE `id` < 881432 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003997s ]
  14. SELECT * FROM `article` WHERE `id` < 881432 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.027232s ]
  15. SELECT * FROM `article` WHERE `id` < 881432 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.008162s ]
0.279837s