乐于分享
好东西不私藏

Hook 系统:插件化安全护栏怎么设计

Hook 系统:插件化安全护栏怎么设计

系列「企业级 AI Agent 实现拆解」第六篇。上一篇讲了 SSE 推流,这篇看安全护栏怎么以插件形式嵌进 ReAct 循环。


为什么需要 Hook

ReAct 循环跑起来后,我遇到了几个没法在循环本身里解决的问题:

  • 某些租户有内部合规规定,LLM 的输出不能含 PII(姓名、电话、身份证号)
  • 高危工具(执行 SQL、发 Email)需要人工审批,但不同租户的审批规则不同
  • 需要记录每次工具调用的详情,但不想把审计逻辑嵌进循环代码

这些需求有个共同特点:它们是横切关注点,跟循环的主逻辑无关,但需要在循环的特定时机插入执行。

做法有两种:把这些逻辑硬编码进循环,或者设计成可配置的钩子。我们选了后者——7 个阶段 × 三种实现类型 × 四种决定,组合成一个插件系统。


7 个 Phase,覆盖完整生命周期

type Phase stringconst (    PhasePreSession  Phase = "pre_session"    // session 建立前    PhasePreModel    Phase = "pre_model_call" // 调 LLM 前    PhasePostModel   Phase = "post_model_call"// LLM 返回后    PhasePreTool     Phase = "pre_tool_use"   // 工具调用前(HITL 在这里)    PhasePostTool    Phase = "post_tool_use"  // 工具返回后(PII 脱敏在这里)    PhasePostSession Phase = "post_session"   // session 结束时    PhaseOnError     Phase = "on_error"       // 任意阶段报错时)

循环里每到一个阶段,就调对应的 HookRunner 方法。application 层只知道接口,不知道背后跑的是什么 hook。


3 种实现:从平台内置到租户自定义

type Impl stringconst (    ImplBuiltin Impl = "builtin" // 内置 Go func    ImplWASM    Impl = "wasm"    // 租户上传 WASM,gVisor 沙箱跑    ImplHTTP    Impl = "http"    // 远程 webhook(对接审批系统、风控))

Builtin:同进程 Go 函数,零网络开销,适合平台级规则(PII 脱敏、SQL 危险关键字检测)。

WASM:租户上传 .wasm 文件,在 gVisor 沙箱里执行,有 CPU/内存限制,租户自定义逻辑但无法逃逸到宿主系统。

HTTP:对接已有的审批系统或风控平台。一个 webhook URL,hook 框架发 POST,等响应里的 decision 字段。


4 种决定,主流程根据结果分支

type Decision stringconst (    DecAllow   Decision = "allow"            // 放行    DecDeny    Decision = "deny"             // 拒绝    DecModify  Decision = "modify"           // 改写 payload 后放行    DecRequire Decision = "require_approval" // 触发 HITL)

DecRequire 是 Hook 系统和 HITL 中断的连接点之一。在实际实现中,HITL 主要通过 Eino 图级的 WithInterruptBeforeNodes(["tools"]) 实现——当 ReAct 循环即将执行工具时,Eino 框架自动暂停图执行(详见第 25 篇)。Hook 的 DecRequire 则是另一种触发方式:PreToolUse hook 检测到高危操作时返回 require_approval,应用层收到后同样调 sess.Pause() 进入等待。两条路径最终汇聚到同一个 Session 状态机。


Dispatch:按优先级串行执行

Hook BC 接受 agent 的 Dispatch(phase, payload) 请求,找出同 phase 的所有 hook,按 priority 升序执行:

// dispatch.go — Handle(简化)func(h *DispatchHandler) Handle(ctx context.Context, in DispatchInput) (*DispatchResult, error) {    list, _ := h.hooks.ListByPhase(ctx, in.TenantID, in.Phase)    payload := in.Payload    for _, hk := range list {        if !hk.Matches(payload) { continue }        // 找到对应的 runner(builtin / wasm / http 三种实现)        runner, ok := h.runners[hk.Impl()]        if !ok { continue }        // 带超时执行        hctx, cancel := context.WithTimeout(ctx, time.Duration(hk.TimeoutMs())*time.Millisecond)        start := time.Now()        decision, modified, reason, runErr := runner.Run(hctx, hk, payload)        cancel()        // 发布执行事件(outbox pattern → NATS → audit consumer 落库)        h.bus.Publish(ctx, in.SessionID, []model.DomainEvent{            model.EventHookExecuted{                HookName: hk.Name(), Decision: decision,                LatencyMs: time.Since(start).Milliseconds(),            },        })        // hook 报错:看 fail_open 决定放行还是 deny        if runErr != nil {            if hk.FailOpen() { continue }            return &DispatchResult{Decision: model.DecDeny, DenyReason: runErr.Error()}, nil        }        switch decision {        case model.DecDeny:            // 额外发一条 EventHookDenied,审计链需要            h.bus.Publish(ctx, in.SessionID, []model.DomainEvent{model.EventHookDenied{...}})            return &DispatchResult{Decision: model.DecDeny, DenyReason: reason}, nil        case model.DecRequire:            return &DispatchResult{Decision: model.DecRequire, DenyReason: reason}, nil        case model.DecModify:            payload = modified  // 改写 payload,后续 hook 看到新的        }    }    return &DispatchResult{Decision: model.DecAllow, ModifiedPayload: payload}, nil}

三个设计决定值得说明:

deny/require_approval 遇到立即返回:一个 hook 说拒绝了,就没必要再问下一个。

modify 累积:payload 一层层改,PostToolUse 阶段用这个做 PII 脱敏——第一个 hook 把姓名脱敏,第二个把电话脱敏,最终拼进消息历史的是脱敏后的版本。

执行事件走 outbox pattern:每次 hook 执行完,先发一条 EventHookExecuted 领域事件到 outbox 表,再由 relay 异步推 NATS,audit consumer 消费后落 hook_executions 表。比 goroutine 直写更可靠:DB 写入成功即不丢失,NATS 不可用时 relay 会重试。


fail_open:不同场景不同容忍度

Hook.failOpen 决定 hook 本身报错时的处理(默认 true):

  • fail_open=true
    (默认):hook 挂了就跳过继续。适合审计告警——告警系统挂了不能阻塞业务。
  • fail_open=false
    :hook 挂了按 deny 处理。适合 PII 脱敏——合规系统挂了就不该让数据出去。

每次 hook 执行都会发布 EventHookExecuted 领域事件,经过 outbox → NATS → audit consumer 链路,最终写入 hook_executions 表。审计系统能直接查哪个 hook 在什么时候做了什么决定、耗时多少。


Hook 怎么接入 ReAct 循环:Eino Callback 桥接

上面定义了 Hook 的模型和 Dispatch 逻辑,但 ReAct 循环是 Eino 在跑——Eino 不知道什么是 Hook、什么是 Phase。两者之间的桥梁是 einoadapter/callback.go

Eino 框架提供了一个 Callback 机制:在图的节点执行前后,框架会调用注册的回调函数。我们的 AgentCallback 就是利用这个机制,把 Eino 的回调翻译成 HookRunner 的方法调用:

// callback.go(简化)funcNewAgentCallback(runner port.HookRunner, streamer port.Streamer, sid model.SessionID) callbacks.Handler {    b := callbacks.NewHandlerBuilder()    // Eino 节点开始执行时    b.OnStartFn(func(ctx context.Context, info *callbacks.RunInfo, input ...) context.Context {        switch info.Component {        case "ChatModel":                          // LLM 节点            runner.BeforeModelCall(ctx, sid, ...)  // → pre_model_call hook        case "Tool":                               // 工具节点            runner.BeforeToolUse(ctx, sid, ...)    // → pre_tool_use hook            streamer.Emit(ctx, sid, StreamEvent{Type: "turn.tool_call", ...})  // → SSE        }        return ctx    })    // Eino 节点执行完成后    b.OnEndFn(func(ctx context.Context, info *callbacks.RunInfo, output ...) context.Context {        switch info.Component {        case "ChatModel":            runner.AfterModelCall(ctx, sid, ...)   // → post_model_call hook        case "Tool":            runner.AfterToolUse(ctx, sid, ...)     // → post_tool_use hook            streamer.Emit(ctx, sid, StreamEvent{Type: "turn.tool_result", ...})  // → SSE        }        return ctx    })    // 节点报错时    b.OnErrorFn(func(ctx context.Context, info *callbacks.RunInfo, err error) context.Context {        runner.OnError(ctx, sid, err)              // → on_error hook        return ctx    })    return b.Build()}

OnStart 对应 “调用前”(BeforeModelCall、BeforeToolUse),OnEnd 对应 “调用后”(AfterModelCall、AfterToolUse),OnError 对应 “报错时”。Eino 告诉你"哪个组件在干什么",callback 把它翻译成具体的 hook 方法调用。

注意 callback 还顺便做了 SSE 推流——BeforeToolUse 时发 turn.tool_callAfterToolUse 时发 turn.tool_result。因为这两个时机和 SSE 推流的时机完全重合,放在同一个 callback 里最自然,不用再加一层。


小结

Hook 系统的价值在于把安全策略从循环代码里解耦出来。加一条 PII 脱敏规则,不需要改 ReAct 循环,在数据库里插一行 hook 配置,下一次循环就生效。

解耦的关键是一层桥接:Eino Callback 负责在节点执行前后通知我们,AgentCallback 把通知翻译成 HookRunner 方法调用,DispatchHandler 按 priority 串行执行匹配的 hook。三层各管各的——Eino 管图的执行,Callback 管时机翻译,Hook 管业务策略。


下一篇:工具调用 —— Agent 的手和眼

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-29 19:21:13 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/673337.html
  2. 运行时间 : 0.100974s [ 吞吐率:9.90req/s ] 内存消耗:4,733.20kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0b8b512e435a2bfd3eaa9a6a5decd83c
  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 ( 3.94 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.30 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.000658s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000990s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000378s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000299s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000661s ]
  6. SELECT * FROM `set` [ RunTime:0.000251s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000732s ]
  8. SELECT * FROM `article` WHERE `id` = 673337 LIMIT 1 [ RunTime:0.001358s ]
  9. UPDATE `article` SET `lasttime` = 1780053674 WHERE `id` = 673337 [ RunTime:0.004880s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000361s ]
  11. SELECT * FROM `article` WHERE `id` < 673337 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000641s ]
  12. SELECT * FROM `article` WHERE `id` > 673337 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000489s ]
  13. SELECT * FROM `article` WHERE `id` < 673337 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000969s ]
  14. SELECT * FROM `article` WHERE `id` < 673337 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005555s ]
  15. SELECT * FROM `article` WHERE `id` < 673337 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.003893s ]
0.102687s