乐于分享
好东西不私藏

.NET+AI | Agent | 给 Agent 一个健壮的 Shell 工具

.NET+AI | Agent | 给 Agent 一个健壮的 Shell 工具

用 MAF 的 ShellEnvironmentProvider 注入 Shell 环境快照:让模型稳定产出可执行命令

你可能遇到过这种“看起来离谱但非常真实”的翻车:

  • 模型生成了 export DEMO_TOKEN=hello-world,但你实际运行的是 PowerShell。
  • 模型让你 cd /tmp,但你在 Windows 环境里根本没有这个路径。
  • 模型建议执行 dotnet test,但当前 Shell 的 PATH 里没有 dotnet
  • 模型写了相对路径 ./src/...,但当前工作目录并不在 repo 根目录。
  • 同一组命令在一个 Agent session 里能跑,换一个 session 就不行。

这些问题的本质往往不是模型“不聪明”,而是它在猜环境

命令型 Tool 尤其依赖运行时上下文:Shell 类型、操作系统、当前目录、常用 CLI 是否安装、CLI 版本是什么。只要其中一个前提猜错,命令逻辑再正确,也可能无法执行。

所以本文的核心判断很直接:

对 Shell / CLI 型 Agent 来说,把真实环境快照注入到模型上下文,是提升命令正确率和可复现性的关键工程手段。

在 Microsoft Agent Framework (MAF) 里,这个能力已经有了对应实现:Microsoft.Agents.AI.Tools.Shell 包中的 ShellEnvironmentProvider

它会探测当前 Shell 环境,并把一段环境说明注入到 AIContext.Instructions,让模型基于真实环境生成命令,而不是凭经验猜。


问题复盘:命令型 Tool 为什么最容易翻车

当你把 Shell 工具接进 Agent,让模型产出“可执行命令”时,它最容易在哪些点翻车?通常集中在四类环境差异。

1. Shell 类型不一致:PowerShell vs POSIX Shell

PowerShell 和 bash / zsh / sh 的语法差异非常大。

比如设置环境变量,在 PowerShell 中是:

而在 POSIX Shell 中是:

如果模型不知道当前 Shell 类型,就很容易在 PowerShell 里生成 bash 命令,或者在 Linux/macOS 里生成 PowerShell 命令。

2. 当前工作目录不一致

模型写相对路径时,通常隐含了一个前提:我现在在项目根目录

但真实执行时,当前目录可能是:

  • Notebook 所在目录
  • 后端服务启动目录
  • 临时目录
  • Docker 容器内 /workspace
  • Persistent Shell 上一次 cd 后留下的目录

一旦 cwd 不一致,./src../artifactsdotnet test ./tests/... 都可能失败。

3. PATH 与可用 CLI 差异

模型可能假设这些命令存在:

  • dotnet
  • git
  • node
  • python
  • docker
  • kubectl

但真实环境不一定安装,或者版本不一致。

对命令型 Agent 来说,“有没有这个 CLI”和“版本是多少”不是细节,而是命令能否执行的前提。

4. OS 差异:Windows / Linux / macOS

不同 OS 会影响:

  • 路径分隔符
  • 默认 Shell
  • 命令别名
  • 可执行文件后缀
  • 临时目录路径
  • 编码行为
  • 文件权限语义

所以同一句“看起来正确”的命令,在不同 OS 上可能完全不可用。

结论是:

我们要的不是“更会猜命令的模型”,而是“在给定环境约束下,产出可复现、可执行命令的 Agent”。

这就引出了 ShellEnvironmentProvider 的价值。


MAF Shell 工具的真实组成

Microsoft.Agents.AI.Tools.Shell 提供了几个核心类型:

类型
作用
ShellExecutor
抽象基类,定义初始化、执行命令、转换为工具、释放资源
LocalShellExecutor
在当前宿主机真实 Shell 中执行命令
DockerShellExecutor
在 Docker 容器中执行命令,提供更强隔离
ShellResult
表示一次命令执行结果,包括 stdout、stderr、exit code、duration、timeout 等
ShellEnvironmentProvider
探测 Shell 环境,并把环境说明注入到 AIContext.Instructions
ShellMode
控制 Shell 执行模式:Stateless 或 Persistent
ShellPolicy
基于 regex 的 allow / deny 预过滤器

典型用法如下:

如果你要把 Shell 暴露给 Agent,可以使用:

默认工具名是 run_shell

更重要的是,默认情况下 AsAIFunction() 会返回带审批语义的工具,也就是每次 Shell 命令执行前都应该经过用户确认。这一点非常关键,因为 Shell 工具不是普通查询工具,它会对真实环境产生影响。


ShellEnvironmentProvider 做了什么

ShellEnvironmentProvider 的职责不是执行用户任务,而是回答一个更基础的问题:

当前 Agent 面对的 Shell 环境到底是什么?

它会通过传入的 ShellExecutor 执行探测命令,捕获一份 ShellEnvironmentSnapshot

这份快照包含:

  • Shell family:Posix 或 PowerShell
  • OS 描述
  • Shell 版本
  • 当前工作目录
  • 常用 CLI 版本,例如:
    • git
    • dotnet
    • node
    • python
    • docker

然后它会把这份快照格式化成一段系统提示,注入到 AIContext.Instructions

这点很重要:它不是把环境信息作为普通 user message 注入,而是作为 instructions 注入。原因是 Shell 环境属于稳定运行时元数据,应该以更高优先级约束模型行为。

例如 POSIX 环境下,它会提示模型:

PowerShell 环境下,则会提示:

这就是“让模型读环境,而不是猜环境”。


为什么是 Context Provider,而不是写死在 Tool 描述里

你可能会问:为什么不直接把 Shell 信息写进工具 description?

因为工具 description 更适合描述“这个工具能做什么”,而不是描述“当前运行环境是什么”。

当前运行环境是动态的:

  • 当前目录可能变化
  • CLI 可能安装或卸载
  • Docker 容器环境和宿主机环境不同
  • Persistent Shell 的 cwd 和环境变量可能跨调用保留
  • 不同 session 可能对应不同 workspace

所以环境信息应该由 Context Provider 在调用前动态提供,而不是写死在静态工具描述里。

ShellEnvironmentProvider 的位置可以理解为:

它解决的是“模型调用工具前知道环境约束”的问题。


Stateless vs Persistent:Shell 状态到底怎么管理

LocalShellExecutor 支持两种模式:

这两个模式决定了 Shell 状态是否跨调用保留。

Stateless:每次调用都是新 Shell

Stateless 模式下,每次 RunAsync() 都启动一个新的 Shell 进程。

这意味着:

  • cd
     不会影响下一次调用
  • export
     / $env: 设置不会影响下一次调用
  • 每次命令更独立
  • 状态隔离更强

适合:

  • 只读检查
  • 单次命令
  • CI / 批处理
  • 你更关注可复现性,而不是交互便利性

示例:

如果你先执行:

下一次再执行:

它通常不会保留上一次的 cd 状态。

Persistent:同一个长生命周期 Shell

Persistent 模式下,一个长生命周期 Shell 会被复用。

这意味着:

  • cd
     会影响后续命令
  • 环境变量会保留
  • Shell 函数定义可能保留
  • 更适合多步骤 Coding Agent

例如:

如果 Agent 的任务是:

  1. 进入项目目录
  2. 查看文件
  3. 运行测试
  4. 根据失败结果修改命令

Persistent 模式更自然,因为它避免了“Agent 已经 cd 过,但下一次命令又回到默认目录”的问题。

但 Persistent 也带来一个非常重要的生命周期约束:

一个 Persistent executor 应该只属于一个 conversation / agent session,不能跨用户、跨租户、跨并发会话共享。

因为它携带可变状态:

  • cwd
  • 环境变量
  • Shell history
  • 函数定义
  • 后台任务
  • 容器内文件系统状态

如果把它注册成 Singleton,就可能发生状态泄露和命令串扰。


ShellEnvironmentProvider 与 Persistent Shell 的配合

ShellEnvironmentProvider 和 Persistent 模式搭配时,价值会更明显。

Persistent Shell 会让 cwd 和环境变量跨调用保留;而 provider 会把当前 Shell 环境注入给模型。

示例结构:

RefreshAsync() 可以强制重新探测环境。

适用场景包括:

  • Agent 安装了新 CLI
  • 用户切换了工作目录
  • 命令失败提示 command not found
  • 容器环境初始化完成后需要重新读取环境

需要注意的是:当前 ShellEnvironmentProvider 会缓存探测结果。也就是说,它不是每次都无条件重新探测。这样可以减少探测成本,但当环境发生关键变化时,你应该显式调用 RefreshAsync()


ShellResult:让模型基于真实输出回答

Shell 命令执行后,结果会保存在 ShellResult 中:

字段
含义
Stdout
标准输出
Stderr
标准错误
ExitCode
退出码
Duration
执行耗时
TimedOut
是否超时
Truncated
输出是否被截断

它还提供:

这个方法会把 stdout、stderr、timeout 和 exit code 整理成模型容易理解的文本。

这对 Agent 很重要:模型不应该“假设命令成功”,而应该根据真实 exit code 和输出继续推理。


安全边界:ShellPolicy 有用,但不是安全机制

ShellPolicy 提供 allow / deny regex 过滤能力。

例如:

它适合做 UX 预过滤:

  • 明显危险的命令提前拒绝
  • 站点特定的敏感命令提前拒绝
  • 给用户更清晰的错误信息

但它不是安全边界。

因为 pattern 很容易被绕过:

  • 变量拼接:${RM:=rm} -rf /
  • 解释器逃逸:python -c "..."
  • 命令替代:$(base64 -d <<< ...)
  • PowerShell 变体:Remove-Item -Recurse -Force
  • 替代工具:find / -delete

所以真正的安全防线应该包括:

  1. approval-in-the-loop
  2. 受控工作目录
  3. 超时限制
  4. 输出截断
  5. 环境变量清理
  6. Docker / VM / 沙箱隔离
  7. 审计日志

DockerShellExecutor:更适合不可信命令

当你不希望模型生成的命令直接运行在宿主机上,可以使用 DockerShellExecutor

它默认偏向安全基线:

  • 网络:none
  • 用户:非 root,65534:65534
  • root filesystem:read-only
  • memory limit:512 MiB
  • pids limit:256
  • capabilities:--cap-drop=ALL
  • security opt:no-new-privileges
  • /tmp
    :tmpfs,限制大小并禁用 suid / device

这比直接运行本地 Shell 更适合不可信命令。

但要注意:容器隔离也不是绝对安全。高风险场景仍应考虑:

  • 专用 VM
  • gVisor / Kata
  • 网络分段
  • 只读挂载
  • 最小权限
  • 完整审计

工程落地建议

你可以按场景选择执行边界:

场景
推荐执行器
审批
隔离策略
本地教学 / Demo
LocalShellExecutor
可在只读命令下显式关闭
受控目录 + 固定命令
个人 Coding Agent
LocalShellExecutor
 或 DockerShellExecutor
高风险命令必须审批
workspace 限制 + timeout + 输出截断
企业生产 / 多租户
DockerShellExecutor
 或更强沙箱
默认开启审批并记录审计
容器 / VM / 网络分段 / 最小权限

如果使用 Persistent 模式,要额外遵守:

  • 不要把 executor 注册为 Singleton
  • 一个用户会话一个 executor
  • 会话结束时释放 executor
  • 提供 reset / refresh 机制
  • 环境变化后调用 RefreshAsync()

总结

命令型 Tool 失败,很多时候不是模型不会写命令,而是它缺少环境前提。

ShellEnvironmentProvider 的价值,就是把这些前提显式注入给模型:

  • 当前是什么 Shell
  • 当前是什么 OS
  • 当前工作目录在哪里
  • 哪些 CLI 可用
  • 这些 CLI 的版本是什么
  • 应该使用哪种命令语法

这样模型就不再“猜环境”,而是基于真实环境生成命令。

同时,Shell 工具也必须谨慎使用:

  • ShellPolicy
     不是安全边界
  • 本地 Shell 默认应保留人工审批
  • Persistent executor 必须一会话一实例
  • 高风险任务应使用 Docker 或更强隔离
  • 环境变化后应刷新 snapshot

最终目标不是让模型“更会写命令”,而是让 Agent 在明确环境约束下,稳定地产出可执行、可复现、可审计的命令。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-03 20:51:53 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/707253.html
  2. 运行时间 : 0.212230s [ 吞吐率:4.71req/s ] 内存消耗:4,745.34kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=9f1076971faf577ec0217283f724c4d6
  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.000897s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000929s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000382s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.003199s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000603s ]
  6. SELECT * FROM `set` [ RunTime:0.000245s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000561s ]
  8. SELECT * FROM `article` WHERE `id` = 707253 LIMIT 1 [ RunTime:0.016558s ]
  9. UPDATE `article` SET `lasttime` = 1780491113 WHERE `id` = 707253 [ RunTime:0.001112s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000319s ]
  11. SELECT * FROM `article` WHERE `id` < 707253 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000563s ]
  12. SELECT * FROM `article` WHERE `id` > 707253 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000533s ]
  13. SELECT * FROM `article` WHERE `id` < 707253 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.005725s ]
  14. SELECT * FROM `article` WHERE `id` < 707253 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.007389s ]
  15. SELECT * FROM `article` WHERE `id` < 707253 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001853s ]
0.216479s