乐于分享
好东西不私藏

Pi 源码阅读指南:如何高效读懂一个 Coding Agent 框架

Pi 源码阅读指南:如何高效读懂一个 Coding Agent 框架

5000+ 行 TypeScript 代码、5 个包、30+ 文件。如果你想从头读懂 Pi 的源码,该从哪里切入?这篇文章给你一条验证过的阅读路径。

前言:读 Agent 源码的正确姿势

读 Agent 框架源码和读 Web 应用源码完全不同。 Web 应用有清晰的请求-响应流程,你顺着路由一路追踪就行。但 Agent 框架的核心是一个异步循环——消息进来、LLM 思考、工具调用、再循环——各模块之间的交互是事件驱动和钩子驱动的。

如果你上来就打开 main.ts 从第一行开始读,大概率会迷失在 CLI 参数解析、Session 恢复、Extension 加载等初始化代码中。这些代码虽然必要,但不是理解 Agent 架构的关键。

我的建议是:从核心循环开始,向外辐射。


阅读路径总览

我把 Pi 的源码阅读分为 5 个阶段。每个阶段聚焦一个核心问题,读完后你就能回答那个问题:

阶段
核心问题
关键文件
预计时间
1️⃣
Agent 循环是怎么跑的?
agent-loop.ts
agent.ts
1-2 小时
2️⃣
LLM 调用是怎么抽象的?
ai/src/types.ts
stream.tsapi-registry.ts
1 小时
3️⃣
工具是怎么定义和执行的?
tools/bash.ts
tools/edit.ts
1.5 小时
4️⃣
Session 和上下文怎么管理?
session.ts
compaction.ts
1 小时
5️⃣
CLI 是怎么把一切串起来的?
main.ts
system-prompt.tsextensions/types.ts
1-2 小时

总投入约 6-8 小时,可以分 2-3 天完成。下面逐阶段展开。


阶段一:Agent Loop —— 一切的心脏

先读什么

packages/agent/src/agent-loop.ts   (~740 行,核心循环)
packages/agent/src/agent.ts        (~200 行,Agent 类)
packages/agent/src/types.ts        (~420 行,类型定义)

为什么先读这里

Agent Loop 是 Pi 最核心的模块——所有其他代码最终都是为了服务这个循环。读懂它,你就理解了 Pi 80% 的设计意图。

怎么读

第一步:先读 types.ts 中的 AgentLoopConfig 接口。

这个接口定义了 Agent Loop 的所有"插座"——也就是上层代码可以注入的行为:

interfaceAgentLoopConfig {
// 消息转换:AgentMessage[] → LLM Message[]
convertToLlm(messagesAgentMessage[]) =>Message[];

// 上下文裁剪(在发给 LLM 前处理)
transformContext(messagesAgentMessage[]) =>AgentMessage[];

// 获取 API Key
getApiKey() =>string;

// 每轮结束后:是否停止?
shouldStopAfterTurn() =>boolean;

// 每轮结束后:切换 model/context?
prepareNextTurn() =>void;

// 获取中途插入的消息
getSteeringMessages() =>AgentMessage[];
getFollowUpMessages() =>AgentMessage[];

// 工具执行前后钩子
beforeToolCall(toolCall) =>BeforeToolCallResult;
afterToolCall(toolCall, result) =>AfterToolCallResult;
}

读完这个接口,你就知道 Agent Loop "不关心什么"——它不关心具体的 LLM Provider,不关心消息格式转换细节,不关心权限控制策略。这些全部通过配置注入。

第二步:读 agent-loop.ts 中的 runLoop 函数。

重点关注:

  1. 1. 双层 while 循环的结构(外层 follow-up,内层 tool-call)
  2. 2. streamAssistantResponse() 的调用方式——它如何组装 LLM 请求
  3. 3. 工具执行流程prepareToolCall → executePreparedToolCall → finalizeExecutedToolCall
  4. 4. 错误处理:abort、LLM 错误、工具执行错误分别怎么处理

可以跳过的部分:

  • • 事件 emit 的具体内容(emit("turn_start") 之类的)
  • • Token usage 统计逻辑
  • • 详细的 abort signal 传递链

第三步:读 agent.ts 中的 Agent 类。

这个类是 Agent Loop 的"用户友好包装":

classAgent {
stateAgentState;           // 当前 transcript

prompt(input): EventStream;  // 发起新对话
continue(): EventStream;     // 继续当前对话
steer(message): void;        // 中途注入消息
followUp(message): void;     // 排队后续消息
abort(): void;               // 取消当前运行
}

读这个文件主要看它如何管理状态(messages 数组)和如何把 prompt/continue/steer/followUp 映射到 Agent Loop 的输入。

阶段一读完后你应该能回答

  • • ✅ Agent 的主循环长什么样?什么时候停止?
  • • ✅ 工具调用是怎么被发现和执行的?
  • • ✅ steering 和 follow-up 有什么区别?
  • • ✅ 上层代码通过哪些钩子影响循环行为?

阶段二:LLM 层 —— 多 Provider 统一调用

先读什么

packages/ai/src/types.ts         (~566 行,核心类型)
packages/ai/src/stream.ts        (~60 行,入口函数)
packages/ai/src/api-registry.ts  (~50 行,Provider 注册)
packages/ai/src/providers/anthropic.ts  (选一个 Provider 实现看)

怎么读

第一步:读 types.ts 中的 Model 接口。

interfaceModel<TApi> {
idstring;          // "claude-sonnet-4-20250514"
namestring;        // 显示名
apiTApi;           // "anthropic-messages"
providerstring;    // "anthropic"
baseUrl?: string;    // 自定义 endpoint
reasoning?: boolean// 是否支持推理
contextWindownumber;
maxTokensnumber;
cost: { input, output, cacheRead?, cacheWrite? };
compatApiCompat;   // 兼容性配置
}

注意 api 字段——这是路由到正确 Provider 实现的关键。同一个 Provider(如 openai)可能有多种 API 类型(completions vs responses)。

第二步:读 stream.ts

只有 60 行,但它是整个 LLM 调用链的入口。核心逻辑就一句话:

exportfunctionstreamSimple(model, context, options) {
const provider = getApiProvider(model.api);
return provider.streamSimple(model, context, options);
}

第三步:读 api-registry.ts

一个全局 Map,支持动态注册/注销 Provider。这就是 Extension 可以添加自定义 LLM Provider 的基础。

第四步(可选):读一个 Provider 实现。

建议读 anthropic.ts 或 openai-responses.ts。重点看:

  • • 如何把 Pi 的 Message[] 转换为 Provider 特定的请求格式
  • • 如何把 Provider 的 SSE 流转换为 Pi 的 AssistantMessageEvent 流
  • • 如何处理 thinking/reasoning tokens

阶段二读完后你应该能回答

  • • ✅ Pi 如何做到一套代码调用 50+ Provider?
  • • ✅ 流式响应的事件协议是什么?
  • • ✅ 如何添加一个新的 LLM Provider?

阶段三:工具系统 —— 精确编辑的秘密

先读什么

packages/coding-agent/src/core/tools/bash.ts   (~442 行)
packages/coding-agent/src/core/tools/edit.ts   (~490 行)
packages/coding-agent/src/core/tools/read.ts   (选读)

怎么读

第一步:读 bash.ts 理解工具的整体结构。

一个工具的完整骨架:

// 1. Schema 定义(TypeBox)
const bashSchema = Type.Object({
commandType.String({ description"..." }),
timeoutType.Optional(Type.Number({ description"..." })),
});

// 2. Operations 接口
interfaceBashOperations {
spawn(commandstringoptionsSpawnOptions): ChildProcess;
}

// 3. 工具定义
functioncreateBashToolDefinition(opsBashOperations) {
return {
name"bash",
description"...",
schema: bashSchema,
executeasync (input, context) => { /* ... */ },
renderCall(input) => { /* TUI 渲染 */ },
renderResult(result) => { /* TUI 渲染 */ },
  };
}

重点关注 execute 函数中的:

  • • 输出流处理:使用 OutputAccumulator + 100ms 节流更新 TUI
  • • 超时机制:timer + process group kill
  • • 输出截断:行数/字节限制,避免 LLM 上下文爆炸

第二步:读 edit.ts 理解精确编辑。

Edit 工具是 Coding Agent 的核心竞争力。重点看:

  1. 1. 参数格式{ path, edits: [{ oldText, newText }] }
  2. 2. 匹配策略oldText 必须在文件中唯一(不唯一则报错)
  3. 3. 兼容性处理prepareEditArguments() 处理旧格式、JSON 字符串格式
  4. 4. 序列化withFileMutationQueue 确保同一文件的操作不并发
  5. 5. Diff 生成:编辑完成后生成 unified diff 返回给 LLM

一个容易忽略的细节:Pi 不用正则匹配,也不用行号定位——它用的是精确字符串匹配。这意味着 LLM 需要精确地复制要替换的文本(包括缩进和空格),但好处是不会因为行号漂移导致改错地方。

阶段三读完后你应该能回答

  • • ✅ 一个工具从定义到执行经历哪些步骤?
  • • ✅ Operations 接口如何实现"位置无关"?
  • • ✅ Edit 工具如何确保精确修改?
  • • ✅ bash 工具如何处理长时间运行的命令?

阶段四:Session 与 Context —— 记忆管理

先读什么

packages/agent/src/harness/session/session.ts            (Session 存储)
packages/agent/src/harness/compaction/compaction.ts      (~756 行,上下文压缩)

怎么读

第一步:读 session.ts 理解树状存储。

核心概念:

interfaceSessionEntry<TMetadata> {
idstring;
parentIdstring | null;  // 形成树结构的关键
type"message" | "compaction" | "model_change" | ...;
dataany;
}

重点看 buildSessionContext() 函数——它从树的某条路径重构出完整的对话上下文(messages + model + thinkingLevel)。理解这个函数就理解了"树状 Session 如何被 flatten 成线性消息列表供 LLM 使用"。

第二步:读 compaction.ts 理解压缩策略。

这个文件较长(756 行),建议分步看:

  1. 1. shouldCompact():什么时候触发压缩?(简单的 token 数阈值判断)
  2. 2. findCutPoint():保留多少近期上下文?(默认 20000 token)
  3. 3. generateSummary():摘要怎么生成?(结构化 prompt → LLM 调用)
  4. 4. compact():完整压缩流程(可能涉及 split-turn 场景)

可以跳过的部分:

  • • estimateTokens() 的具体估算逻辑(就是字符数/4)
  • • split-turn 的边界情况处理(除非你特别感兴趣)

阶段四读完后你应该能回答

  • • ✅ Session 的树状结构具体长什么样?
  • • ✅ Fork 和分支导航是如何实现的?
  • • ✅ 上下文压缩何时触发、如何保证不丢关键信息?
  • • ✅ 为什么用 JSONL 而不是 SQLite?

阶段五:CLI 编排 —— 把一切串起来

先读什么

packages/coding-agent/src/main.ts                          (~722 行,CLI 入口)
packages/coding-agent/src/core/system-prompt.ts            (System Prompt 构建)
packages/coding-agent/src/core/extensions/types.ts         (~1568 行,Extension 类型)
packages/coding-agent/src/core/agent-session-runtime.ts    (运行时管理)

怎么读

第一步:读 main.ts 的前 200 行。

理解启动流程:CLI 参数解析 → App Mode 决策 → Session 恢复/创建 → Runtime Factory。

重点关注 createAgentSessionRuntime() 的调用——它是把前四个阶段所有模块"组装"在一起的地方。

第二步:读 system-prompt.ts

看 Pi 如何动态构建 system prompt:

functionbuildSystemPrompt(options) {
// 1. 工具描述
// 2. Guidelines(行为准则)
// 3. Project context(.pi/ 目录下的文件)
// 4. Skills(注入可用 CLI 工具的描述)
// 5. 日期和 cwd
return systemPrompt;
}

这比你想象的简单——没有复杂的 RAG,没有 few-shot examples,就是纯文本拼接。

第三步:浏览 extensions/types.ts 的事件定义部分。

这个文件有 1568 行,但你不需要全读。快速浏览 ExtensionEvents 接口中定义了哪些事件,理解 Extension 系统的能力边界就够了。

重点关注:

  • • tool_call 事件:Extension 如何拦截工具调用
  • • context 事件:Extension 如何修改 LLM 上下文
  • • ExtensionUIContext:Extension 如何弹出 UI(select/confirm/input)

阶段五读完后你应该能回答

  • • ✅ 从用户输入到 Agent 开始工作,完整的初始化链路是什么?
  • • ✅ System Prompt 包含哪些部分、如何动态生成?
  • • ✅ Extension 系统的能力边界在哪里?
  • • ✅ 不同的运行模式(interactive/print/rpc)有什么区别?

实用技巧:提高源码阅读效率

1. 用 TypeScript 类型做导航

Pi 的类型设计非常严格(Biome 检查 + 禁止 any)。当你看到一个不认识的函数参数时,跳转到它的类型定义——类型本身就是最好的文档。

// 看到这个不认识?
asyncfunctionrunLoop(messagesAgentMessage[], contextAgentContextconfigAgentLoopConfig)

// 跳转到 AgentLoopConfig 的定义,所有行为一目了然

2. 忽略 TUI 渲染代码

每个工具都有 renderCall 和 renderResult 函数,用于在终端漂亮地展示输入/输出。除非你对 TUI 感兴趣,否则可以完全跳过这些代码——它们不影响核心逻辑。

3. 从 tests 验证你的理解

虽然 Pi 的测试覆盖不算密集,但关键模块(如 compaction、edit tool)都有测试。当你觉得"这段代码应该是做 X 的"时,去看对应的测试文件确认你的理解。

# 查找某个模块的测试
find packages -name "*.test.ts" | grep compaction
find packages -name "*.test.ts" | grep edit

4. 用 AGENTS.md 作为辅助

AGENTS.md 是写给贡献者(包括 AI Agent 贡献者)的规则文件。它包含了项目的代码风格要求、PR 工作流、命名规范。读这个文件能帮你快速理解"为什么代码是这样组织的"。

5. 画依赖图

Pi 的 5 个包之间有明确的依赖关系。在读代码时保持这张图在脑中:

coding-agent → agent-core → ai
coding-agent → tui
coding-agent → web-ui → ai

当你在 agent-core 中看到一个接口,而在 coding-agent 中看到实现时,你就知道为什么要这样分——为了让 agent-core 可以独立复用


可以跳过的部分

为了节省时间,以下内容在初次阅读时可以跳过:

跳过的内容
原因
packages/tui/
 整个包
纯 UI 渲染,不影响架构理解
packages/web-ui/
 整个包
同上
packages/ai/src/providers/*.ts
看一个就够了,其他都是类似的 HTTP 调用
packages/ai/src/models.generated.ts
自动生成的模型目录,不需要读
.github/
 和 scripts/
CI/CD 和构建脚本,与架构无关
TUI 渲染函数(renderCall/renderResult
除非你想学 Ink/React 终端渲染

与其他 Agent 源码的阅读对比

如果你还想读其他 Agent 框架的源码,这里给一个难度和侧重点的对比:

项目
代码量
难度
侧重学习点
Pi
~5000 行核心
⭐⭐⭐
Agent 循环设计、Extension 钩子系统
OpenCode
~20000 行核心
⭐⭐⭐⭐⭐
Effect 函数式编程、Client-Server 架构
aider
~8000 行 Python
⭐⭐⭐
Git 集成、Diff 编辑策略
Goose
~6000 行 Rust
⭐⭐⭐⭐
性能优化、MCP 集成

Pi 的优势在于层次分明、命名直观、TypeScript 类型完善。如果你读过 Effect(OpenCode 的核心库),就知道那种函数式管道嵌套有多烧脑——Pi 完全没有这个问题,它就是朴素的面向对象 + 钩子模式。


一周阅读计划(推荐)

如果你想系统地读完 Pi 源码,建议按这个节奏:

目标
产出
Day 1
阶段一:Agent Loop
画出循环流程图
Day 2
阶段二 + 三:LLM 层 + 工具系统
理解一次完整的工具调用链路
Day 3
阶段四:Session + Compaction
理解长对话如何持续
Day 4
阶段五:CLI 编排 + Extension
理解整体组装逻辑
Day 5
回顾 + 实验
尝试写一个简单的 Extension

Day 5 的实验非常重要。 读代码最好的方式是改代码。Pi 的 Extension 系统门槛很低——你不需要修改框架源码,只需要写一个 TypeScript 文件,就能钩入整个生命周期。


结语

Pi 是我目前读过的架构最清晰的开源 Coding Agent 框架。不是说它功能最强——它没有 RAG、没有 MCP、没有多 Agent——但它的代码组织和抽象层次确实值得学习。

如果你正在构建自己的 Agent 系统,Pi 的源码能给你三个明确的启发:

  1. 1. Agent 引擎和工具实现要分开——别让 bash 执行逻辑污染循环逻辑
  2. 2. 钩子比配置灵活十倍——给用户注入点而不是选项
  3. 3. Session 不是消息列表,是操作历史树——这决定了你能支持多复杂的工作流

去读吧。源码不骗人。


基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-24 12:21:32 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/661789.html
  2. 运行时间 : 0.121126s [ 吞吐率:8.26req/s ] 内存消耗:4,917.85kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=38f6bd3aa3ddccc73b8b0b2546cf0f75
  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.000417s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000684s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000300s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000253s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000467s ]
  6. SELECT * FROM `set` [ RunTime:0.000197s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000504s ]
  8. SELECT * FROM `article` WHERE `id` = 661789 LIMIT 1 [ RunTime:0.003256s ]
  9. UPDATE `article` SET `lasttime` = 1779596492 WHERE `id` = 661789 [ RunTime:0.003192s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000225s ]
  11. SELECT * FROM `article` WHERE `id` < 661789 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000427s ]
  12. SELECT * FROM `article` WHERE `id` > 661789 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000376s ]
  13. SELECT * FROM `article` WHERE `id` < 661789 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003038s ]
  14. SELECT * FROM `article` WHERE `id` < 661789 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.005946s ]
  15. SELECT * FROM `article` WHERE `id` < 661789 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.006749s ]
0.125140s