乐于分享
好东西不私藏

Checkpoint 源码:Agent 执行到一半怎么保存(第80篇-E66)

Checkpoint 源码:Agent 执行到一半怎么保存(第80篇-E66)

系列「企业级 AI Agent 实现拆解」E66 篇,Part 14 记忆篇第四章。上一篇讲记忆多了怎么衰减淘汰——那是长期知识。这篇讨论另一种持久化:Agent 正在执行时被中断了(用户关页面、服务器重启、手动暂停),怎么保存状态、下次从哪接着跑。

这篇回归 Eino 主线代码。compose.CheckPointStore 是 Eino 框架里正式定义的接口(不像前几篇记忆那样是项目自己设计的)。它的核心只有两个方法——Get 和 Set 两块 []byte,但中间发生的事值得拆开看。

读完这篇你会知道

  • CheckPointStore
     只有两个方法:Get 和 Set,参数都是 string + []byte——框架不关心你存哪、用什么格式
  • checkpoint 里实际存的是什么:通道状态、各节点输入、图级 State、嵌套子图中断信息,共七种类型
  • Go 里 interface{} 的 typed nil 问题:一个看起来是 nil 的值,序列化后回去不是 nil——eino 在底层做了转换但你可以绕过
  • 流式管道怎么被序列化:存 checkpoint 前把 streamReader 展开成普通值,恢复时再包回去
  • WriteToCheckPointID != CheckPointID
    :从一个旧 checkpoint 恢复,把新的进度存到另一个地方
  • 中断怎么跟 checkpoint 协同:InterruptID2Addr 记录谁在哪个节点暂停了,恢复时框架知道该从哪继续
  • StateModifier
     是个钩子:每次 checkpoint 读写时你都有一次机会修改图 State

一、接口就是两块 []byte

CheckPointStore 定义在 eino/internal/core/interrupt.go

type CheckPointStore interface {    Get(ctx context.Context, checkPointID string) ([]byteboolerror)    Set(ctx context.Context, checkPointID string, checkPoint []byteerror}

两个方法,参数全是字符串和字节数组。**没有 schema、没有版本号、没有 lastModified、没有任何索引能力。**四个字:字节存在哪由你决定。

这很 Go——框架只定协议,不帮你挑存储。map[string][]byte 能当 CheckPointStore,Redis 能,S3 能,PostgreSQL 也能。

框架另外定义了一个可选接口:

type CheckPointDeleter interface {    Delete(ctx context.Context, checkPointID stringerror}

store 如果没实现 Delete,过期的 checkpoint 就永远不会被框架自动清理。注释说得很直白——「自己管生命周期,比如 TTL、外部清理、或者实现这个接口」。

你可以用一个 map 当 store,用另一个 Redis 当 store,但生产上务必加过期清理。


二、checkpoint 里到底存了什么

框架往里塞的不是随机的 []byte,而是一个 checkpoint 结构体的序列化:

type checkpoint struct {    Channels       map[string]channel               // ① 通道状态    Inputs         map[string]any                   // ② 各节点本轮输入    State          any                               // ③ 图级 State    SkipPreHandler map[string]bool                   // ④ 跳过哪些节点的前处理    RerunNodes     []string                          // ⑤ 需重跑的节点    SubGraphs map[string]*checkpoint                 // ⑥ 嵌套子图的 checkpoint    InterruptID2Addr  map[string]Address            // ⑦ 中断 ID → 地址    InterruptID2State map[string]core.InterruptState //   同一中断的内部状态}

七种信息,各自在恢复流程里扮演不同角色:

① Channels:DAG 和 Pregel 的通道——节点之间传数据的东西。保存下来意味着恢复时不需要重新计算已完成的节点,直接从通道里取值继续。这也决定了 checkpoint 的写入时机:一个超级步完成后,不是每执行一个节点就写一次。

② Inputs:每个节点本轮收到了什么输入。类型是 map[string]any——key 是节点名,值可以是任意类型。这里面就有 Go typed nil 的坑,第四节会展开。

③ State:你在 NewGraph 时用 WithGenLocalState 创建的那个状态对象。Eino 框架提供的唯一一个「把业务数据带进 checkpoint」的钩子。如果你的 Agent 需要在中断恢复后知道「上次做到了第几步」,数据放这里是最合适的。

④ SkipPreHandler / ⑤ RerunNodes:哪几个节点重跑时不走预处理。正常流程里节点从预处理开始执行,但从 checkpoint 恢复时已经跑过一部分——不需要再预处理一遍,直接从上次中断的位置继续。这两个字段记录了哪些节点该跳过预处理、哪些要重跑。

⑥ SubGraphs:图可以嵌套——一个图节点里面可能又是一个完整的图(比如一个工具节点的执行路径)。子图的 checkpoint 存在这里,父图自己的检查点存在父级。这个设计让嵌套图的中断恢复天然递归——恢复父图把子图 checkpoint 递进去就好。

⑦ InterruptID2Addr / InterruptID2State:下一节是重点。


三、中断与 checkpoint 的关系

第 4 篇讲 HITL 时说过——Agent 执行到调用工具这一步,框架会暂停等用户确认。暂停的信息存在哪?

就在这个 checkpoint 的这两个 map 里。

InterruptID2Addr 记录了哪个中断 ID 对应图里的哪个节点位置InterruptID2State 存着该中断的内部状态——框架需要知道这个中断是 PENDING(等着被恢复)、DONE(已处理)、还是 TIMEOUT(过期了)。

恢复流程大致是这样:

  1. 用户点击「继续」→ 前端把 checkpointID 和 interruptID 发给后端
  2. 框架拿 checkpointID 从 store 里 Get 出来,反序列化成 checkpoint
  3. 从 InterruptID2Addr 找到是哪个节点卡住了
  4. 从 Channels 和 Inputs 恢复这个节点需要的上下文
  5. 从 State 恢复业务数据
  6. 从那个节点继续往下跑——前面跑完的不会重新跑一遍

这个流程里最容易被忽略的一步在第 5 步:**State 是你自己的业务对象。**如果你在 WithGenLocalState 里初始化了一堆字段,但中间没更新它们,恢复出来的就是那个初始化的空壳。

checkpoint 不是快照,它不会拍一张你的整个进程内存。 它只存了框架能看见的东西——通道、输入、图中断点、以及你主动放进 State 里的数据。


四、Go 的 typed nil 问题

代码里有一个容易被忽略的细节:normalizeCheckpointTypedNilInputs

在 checkpoint 的 set 方法里:

func(c *checkPointer) set(ctx context.Context, id string, cp *checkpoint) error {    normalizeCheckpointTypedNilInputs(cp)  // ← 必须先过这一关    data, err := c.serializer.Marshal(cp)    // ...}

这个函数在做什么?

funcisTypedNil(v any) bool {    if v == nil { return false }    rv := reflect.ValueOf(v)    switch rv.Kind() {    case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:        return rv.IsNil()    default:        return false    }}

Go 里有一个著名陷阱:一个非 nil 的 interface 可以包装一个 nil 指针。 比如:

var p *MyType = nilvar v any = p== nil   // false!因为 interface 本身(类型信息 + 值)不是 nil

如果这个 v 被序列化成一个具体类型的 nil 指针然后存进 checkpoint,反序列化回来之后它就不再是 nil 了——序列化器会把类型信息一起还原,但框架在判断「这个节点有没有输入」时有 nil 检查。一个 typed nil 会让判断误以为是有效输入,走到错误的执行路径。

normalizeCheckpointTypedNilInputs 在序列化之前把这些 typed nil 全部替换成真正的 nil

保险起见:如果你的 State 里有 interface 字段,存之前自己先检查一遍 typed nil。normalize 只处理 Inputs,不处理你塞在 State 里的自定义数据。


五、流式值的转换:展开再恢复

checkpoint 里存的都是普通数据,但执行中的节点之间可能传的是 streamReader(第 20 篇讲过流式管道)。streamReader 不能直接序列化——它背后有 goroutine 在跑、有 channel 在收数据。

存 checkpoint 时必须先把流读光:

func(c *checkPointer) convertCheckPoint(cp *checkpoint, isStream boolerror {    for _, ch := range cp.Channels {        err = ch.convertValues(func(m map[string]any) error {            return c.sc.convertOutputs(isStream, m)        })    }    return c.sc.convertInputs(isStream, cp.Inputs)}

恢复时反过来——把普通数据包回 streamReader,让下游节点以为自己还是在读一个流:

func(c *checkPointer) restoreCheckPoint(cp *checkpoint, isStream boolerror {    // 同样遍历 Channels 和 Inputs,但做的是 restoreOutputs / restoreInputs}

这意味着存 checkpoint 是有代价的——必须等当前 super-step 的所有流处理完才能序列化。如果你的图里有一个长时间运行的工具调用(比如调用一个图片生成服务等 30 秒),那 checkpoint 就会卡在它完成之后才写。

如果你的 checkpoint store 是一个远程服务(Redis/S3),而 Set 的调用在请求上下文里(没有独立超时),那么这个远程写会成为请求延迟的一部分。解决方式是异步写——但框架现在没帮你做这个,得自己在 Set 实现里异步化。


六、StateModifier:读写前后的钩子

type StateModifier func(ctx context.Context, path NodePath, state any) error

每次 checkpoint 被写入或读出时,框架会调这个函数。path 是当前节点的路径(嵌套图里有多个层级),state 是图级的 State

这个钩子用来做什么?

  • 脱敏
    :写入前把手机号、身份证号从 State 里清掉
  • 版本迁移
    :读出旧格式 State 时就地转换成新格式
  • 审计日志
    :读写前后记录谁在什么时间操作了这个 checkpoint

它在 context 里传递:

ctx = context.WithValue(ctx, stateModifierKey{}, modifier)

所以每个请求可以带不同的 modifier,不像 WithGenLocalState 是编译时固定的。


七、几个不那么明显的东西

① WithWriteToCheckPointID:从 A 恢复,存到 B

funcWithWriteToCheckPointID(checkPointID string) Option

没用过的人容易忽略这个字段。它让你可以从一个已有的 checkpoint 恢复执行,但把新的状态存到一个新的 checkpoint ID 里

应用场景:**回溯。**用户对某个工具调用的结果不满意,想回到调用之前换个问法。这时候你需要从旧 checkpoint 恢复(CheckPointID = old),但不能覆盖它(覆盖了就回不去了),所以写到一个新地方(WriteToCheckPointID = new)。

② WithForceNewRun:完全无视已有 checkpoint

func WithForceNewRun() Option

就算 checkpointID 对应的地方有数据,也全部忽略,从头开始跑。相当于给用户一个「重新开始」的按钮。

③ MigrateCheckpointState:架构升级

funcMigrateCheckpointState(data []byte, serializer Serializer,    migrate func(state any) (any, boolerror)) ([]byteerror)

你的图 State 改字段了(比如老版本叫 History,新版本改名叫 Messages),但用户还有几十个存量的 checkpoint 没跑完。这个函数就是用来批量迁移的:拿到旧的序列化数据、把所有 State 跑一遍你的 migrate 函数、返回新的序列化数据。

注释里专门提到 changed 返回值:如果 changed=false,说明这条 checkpoint 里的 State 不需要改,函数返回完全不修改的原始字节——没有拷贝、没有重新序列化、没有浪费 CPU。

④ 序列化器默认是内部的 gob

如果不传 WithSerializer,用的就是 eino 自己的 serialization.InternalSerializer(本质上是 gob + 类型注册表)。如果你在 State 里存了 gob 不认识的自定义类型,需要调用 schema.RegisterName[T] 注册。

func init() {    schema.RegisterName[*checkpoint]("_eino_checkpoint")    schema.RegisterName[*dagChannel]("_eino_dag_channel")    // ...}

eino 自己的内部类型是在 init() 里自动注册的,所以默认能用。但你的类型得自己注册。

如果不想注册也不想换序列化器,那就别在 State 里放复杂类型,放 map[string]any


小结

  • 接口极其简单
    Get(id) → []byteSet(id, []byte),框架不关心你存哪
  • checkpoint 里不是整堆内存
    ,是 7 种框架能追踪的东西:通道状态、节点输入、图 State、子图、中断信息——你的业务数据只有 State 这一个入口
  • 中断恢复全靠这两个 map
    InterruptID2Addr(哪个节点) + InterruptID2State(什么状态)。第 4 篇讲的上层 HITL,底层就是这两个 map
  • Go 的 typed nil
     可能绕过序列化器的 nil 检查:eino 只在存 checkpoint 前处理 Inputs,不检查你放 State 里的自定义数据
  • 存 checkpoint 之前要先读光所有流
    streamReader 不能直接序列化,得展开成普通值,恢复时再包回去。代价是必须等当前 super-step 跑完
  • WriteToCheckPointID 是回溯的基础
    :从一个旧 checkpoint 恢复,存到新地方,原来的不动
  • 加 CheckPointDeleter 或 TTL
    :不然后面全是死 checkpoint

下一篇讲用户画像——Agent 怎么从对话里自动提炼出你是谁、你喜欢什么:异步提取、结构化 Profile、以及为什么不在对话主路径上做。


代码状态说明

**本篇是源码解读,没有跑 demo。**所有 Go 代码、接口定义均引自 eino v0.9.13 的 compose/checkpoint.go 和 internal/core/interrupt.go;参考 inmem 实现来自 eino-examples/compose/graph/react_with_interrupt/main.go。是我从源码里读的行为,不是我自己写的。

没有实测的部分:typed nil 在序列化前后的行为差异是 Go 语言层面的已知特征,不是我在特定版本上触发的 bug;streamReader 的展开/恢复流程我只做了源码阅读,没有构造一个故意卡流的图来验证行为。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-11 22:06:33 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/924870.html
  2. 运行时间 : 0.254941s [ 吞吐率:3.92req/s ] 内存消耗:4,915.01kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=39f1f39a9bf1a3b42a8a623eb7c27230
  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.001098s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001649s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000736s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000673s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001373s ]
  6. SELECT * FROM `set` [ RunTime:0.000607s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001493s ]
  8. SELECT * FROM `article` WHERE `id` = 924870 LIMIT 1 [ RunTime:0.004080s ]
  9. UPDATE `article` SET `lasttime` = 1786457193 WHERE `id` = 924870 [ RunTime:0.001516s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000595s ]
  11. SELECT * FROM `article` WHERE `id` < 924870 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001078s ]
  12. SELECT * FROM `article` WHERE `id` > 924870 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004996s ]
  13. SELECT * FROM `article` WHERE `id` < 924870 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.023525s ]
  14. SELECT * FROM `article` WHERE `id` < 924870 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.019985s ]
  15. SELECT * FROM `article` WHERE `id` < 924870 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005385s ]
0.259236s