当前位置:首页>python>从 0 到 1:用 Python 实现一个本地单进程 Mini Agent

从 0 到 1:用 Python 实现一个本地单进程 Mini Agent

  • 2026-07-01 03:36:51
从 0 到 1:用 Python 实现一个本地单进程 Mini Agent

把一个“会聊天的模型”,做成一个真正能读代码、改代码、做验证的最小 Agent。

一、先说结论:Mini Agent 不是一个大 Prompt

很多人第一次做 Agent,会从一个很自然的想法开始:

“我已经有模型接口了,再写一段很长的 system prompt,让模型自己规划、自己写代码、自己执行,不就行了吗?”

实际做下来,很快就会发现这条路不够。

原因很简单。一个真正能工作的 Coding Agent,解决的不是“怎么让模型多说一点代码”,而是下面这件事:

用户给出任务-> Agent 理解当前工作区-> Agent 读取相关文件-> Agent 决定下一步要做什么-> Agent 修改代码-> Agent 跑验证-> Agent 根据结果继续调整-> Agent 输出带证据的结论

这已经不是一次文本生成,而是一个带状态、带工具、带边界、带验证的执行系统。

所以这篇文章不讲“怎么写一个超级复杂的 Agent 平台”,只讲一件更重要的事:

如何从 0 到 1,用 Python 做出一个最小但真实可用的本地单进程 Mini Agent。

主线很明确:

  • • 语言:Python
  • • 形态:本地单进程 CLI
  • • 目标:先跑通最小闭环,再考虑扩展能力

二、我们到底要实现一个什么样的 Agent

在开始写代码之前,先把目标收紧。

如果目标定义成“支持很多模型、很多工具、很多 UI”,项目很快就会失控。

更好的定义方式是:

一个最小可用的 Mini Agent,应该能够在本地工作区里读取上下文、执行工具、修改代码、做最基本验证,并输出带证据的结果。

也就是说,我们先不追求:

  • • 多 Agent 编排
  • • Web 控制台
  • • 复杂 Planner
  • • Repo 级语义索引
  • • 超长链路自动恢复

我们先追求一个最小闭环。

这个闭环可以浓缩成一句话:

读 -> 改 -> 验 -> 报

只要这四步跑通,Agent 就成立了。

三、为什么选择 Python + 本地单进程 CLI

这是一个非常务实的选择。

原因不是因为它最炫,而是因为它最适合从 0 到 1:

  • • Python 足够快地把原型跑起来
  • • 单进程让调试最简单
  • • CLI 是最自然的 Agent 入口
  • • 没有服务编排负担
  • • 没有前后端分离负担
  • • 更容易把注意力放在 Agent 内核,而不是外围系统

如果你一开始就做成:

  • • Web 服务
  • • 多 worker 调度
  • • 任务队列
  • • 子 Agent 分发
  • • 浏览器控制台

那么你大概率会先陷入系统复杂度,而不是先把 Agent 跑通。

所以从工程角度看,Python + 本地单进程 CLI 是最合理的起步路线。

四、先搭一个最小架构,不要写成一坨脚本

虽然我们做的是 Mini Agent,但它也不应该是一团揉在一起的代码。

更好的最小结构是这样:

CLI  -> Runner      -> Prompt Builder      -> Model Client      -> Tool Registry      -> Tool Executor      -> Approval Policy      -> Memory Store      -> Finalizer      -> Run State

把它翻译成人话,大概就是:

  • • cli.py:负责接收用户输入,启动程序
  • • runner.py:负责 Agent 主循环
  • • prompts.py:负责拼接系统提示词和上下文
  • • llm/client.py:负责调用模型
  • • tools/:负责具体动作
  • • approval/:负责边界和审批
  • • memory/:负责加载规则和历史摘要
  • • verify/finalizer.py:负责把结果整理成可读输出
  • • state.py:负责记录运行状态

这个结构的价值非常大:

  1. 1. 你可以逐步实现,而不是一口气写完
  2. 2. 后面增强能力时,不需要推翻已有系统

五、第一步:先让 Agent Loop 跑起来

一个 Agent 的核心不在 CLI,而在 Runner。

你可以把 Runner 理解成一个很小的状态机:

  1. 1. 构造消息
  2. 2. 调模型
  3. 3. 看模型返回的是“回答”还是“工具调用”
  4. 4. 如果是工具调用,就执行工具
  5. 5. 把工具结果追加回上下文
  6. 6. 继续下一轮
  7. 7. 直到完成或到达上限

这就是 Agent 的最小循环。

当前实现里的运行状态定义在 mini_agent/state.py

from dataclasses import dataclass, fieldfrom typing importAnyLiteral@dataclassclassToolObservation:    tool_name: str    args: dict[strAny]    ok: bool    output: str    metadata: dict[strAny] = field(default_factory=dict)@dataclassclassRunState:    task: str    step_count: int = 0    tool_calls: int = 0    status: Literal["running""finished""stopped""error"] = "running"    stop_reason: str | None = None    observations: list[ToolObservation] = field(default_factory=list)    modified_files: list[str] = field(default_factory=list)    verification_commands: list[str] = field(default_factory=list)    verification_passed: bool | None = None

这里最值得注意的不是字段多少,而是这个思想:

  • • Agent 不是无状态聊天
  • • Agent 必须知道自己执行过什么动作
  • • Agent 必须知道自己是否修改过代码
  • • Agent 必须知道修改之后是否做过验证

然后再看 mini_agent/runner.py 中最核心的主循环:

while state.step_count < self.max_steps:    state.step_count += 1    turn = self.model_client.complete(messages, self._tool_schemas())if turn.tool_call isNone:        state.status = "finished"        answer = self.finalizer.build_answer(turn.text or"", state)self.memory_store.append_session_summary(answer)return answer    decision = self.approval_policy.check(        turn.tool_call.name,        turn.tool_call.arguments,    )if decision.action == "deny":        observation = self.tool_executor.denied(turn.tool_call)elif decision.action == "ask":        ...else:        observation = self.tool_executor.execute(turn.tool_call)    state.tool_calls += 1    state.observations.append(observation)

这段代码,就是整个 Mini Agent 的心脏。

这一阶段最重要的原则

不要一上来就追求复杂规划。

先把最小循环跑通。

只要系统已经满足:

  • • 模型能发起工具调用
  • • 工具结果能回到上下文
  • • 模型能基于结果继续下一步

你的 Agent 就已经从“聊天机器人”跨到“执行系统”了。

六、第二步:定义模型输出,不要让它随意发挥

要让 Runner 可控,模型输出就不能是完全自由的文本。

更好的做法是定义一个最小结构化输出。

当前项目在 mini_agent/llm/schemas.py 里用了这样一组结构:

from dataclasses import dataclassfrom typing importAny@dataclassclassToolCall:    name: str    arguments: dict[strAny]idstr | None = None@dataclassclassModelTurn:    text: str | None = None    tool_call: ToolCall | None = None

这其实在工程上做了一件非常重要的事:

它把模型每一轮的选择限制成两种:

  1. 1. 给出最终文本
  2. 2. 发起一个工具调用

对于一个 Mini Agent,这已经足够。

七、第三步:给 Agent 装上眼睛和手

一个最小 Coding Agent,并不需要很多工具。

如果目标只是跑通最小编码闭环,我建议工具集先收敛成这几类:

  • • list_files
  • • read_file
  • • write_file
  • • apply_patch
  • • run_command

如果还需要额外信息,再加:

  • • web_search

1. 先让它看得见

任何写代码动作之前,Agent 都必须先理解当前工作区。

所以最先做的两个工具应该是:

  • • 列目录
  • • 读文件

当前实现里的最小版本在 mini_agent/tools/builtins.py

classListFilesTool:defrun(self, arguments: dict) -> str:        path = ensure_within_workspace(self.workspace, self.workspace / arguments["path"])        items = sorted(p.name for p in path.iterdir())[: self.max_entries]return"\n".join(items)classReadFileTool:defrun(self, arguments: dict) -> str:        path = ensure_within_workspace(self.workspace, self.workspace / arguments["path"])return path.read_text(encoding="utf-8")[: self.max_bytes]

这一步非常像给 Agent 装上眼睛。

2. 再让它有“写”的能力

最直接的写入方式当然是:

  • • write_file

但如果只有这个工具,模型很容易整文件重写。对于真实工程,这样很危险。

所以我们又给它补了一个更适合代码修改场景的工具:

  • • apply_patch

当前项目里的 ApplyPatchTool 不是复杂的 unified diff 解析器,而是一个很适合 MVP 的版本:

classApplyPatchTool:defrun(self, arguments: dict) -> str:        path = ensure_within_workspace(self.workspace, self.workspace / arguments["path"])        old = arguments["old"]        new = arguments["new"]        replace_all = arguments.get("replace_all"False)        ...        text = path.read_text(encoding="utf-8")        match_count = text.count(old)        ...        updated = text.replace(old, new, 1)        path.write_text(updated, encoding="utf-8")returnf"Patched file: {arguments['path']}\nReplacements: {replacements}"

这个实现为什么适合最小 Agent?

因为它有几个非常实际的优点:

  • • 实现简单
  • • 测试容易写
  • • 错误语义清楚
  • • 对小改动非常够用

这一步可以理解成给 Agent 装上了手。

八、第四步:不要急着给自由 Shell,先做工程边界

很多人做 Agent 时最容易踩的坑,就是太早给模型自由命令执行能力。

从“演示效果”看,自由 shell 很酷。

但从工程角度看,这通常意味着:

  • • 边界失控
  • • 风险失控
  • • 排错困难
  • • 用户不敢真的使用

所以在这个项目里,我们做了一个非常重要的选择:

run_command 不是开放 shell,而是一个受控验证工具。

当前实现中的 RunCommandTool 只允许 pytest 风格命令:

classRunCommandTool:    ALLOW_COMMAND_PREFIXES = ("pytest""python -m pytest""python3 -m pytest")    DENY_COMMAND_PREFIXES = ("rm ""del ""rmdir ""shutdown""reboot""curl |""wget |")

这意味着 Agent 的第一职责被严格收敛成:

  • • 改代码
  • • 验证代码

而不是变成任意命令执行器。

九、第五步:把审批层和工具层分开

当你给 Agent 加边界时,最好不要只做一层。

更稳的做法是把“审批策略”和“工具校验”拆开。

当前项目在 mini_agent/approval/policy.py 里定义了审批策略:

classDefaultApprovalPolicy:    READ_ONLY_TOOLS = {"list_files""read_file""web_search"}    ASK_TOOLS = {"write_file""apply_patch"}    ALLOW_COMMAND_PREFIXES = ("pytest","python -m pytest","python3 -m pytest",    )

也就是说,系统会先判断某个动作属于:

  • • allow
  • • ask
  • • deny

然后工具层再做二次校验。

这两层解决的是不同问题:

  • • policy 决定“从系统视角是否允许这类动作”
  • • tool 决定“这个具体参数是否合法”

这是一种非常值得保留的工程模式。

十、第六步:让 Agent 不只是“会写”,而是“会完成代码任务”

一个真正的 Coding Agent,不能只停留在“把文件写出来”。

它必须知道:

  • • 自己是不是改过代码
  • • 改完之后有没有验证
  • • 验证成功了还是失败了

这一点在当前项目里,是通过 RunState + Runner 完成的。

例如在 mini_agent/runner.py 中,我们有这样一段状态更新逻辑:

def_record_observation_effects(self, state: RunState, tool_name: str, arguments: dict, output: str) -> None:if tool_name in {"write_file""apply_patch"}:        path = arguments.get("path")ifisinstance(path, strand path notin state.modified_files:            state.modified_files.append(path)        state.verification_passed = Noneif tool_name == "run_command":        command = arguments.get("command")ifisinstance(command, str):            state.verification_commands.append(command)        exit_code = self._extract_exit_code(output)if exit_code isnotNone:            state.verification_passed = exit_code == 0

这段代码其实非常关键,因为它把“写代码”从一次文本生成,变成了一个有状态的工程过程。

也正因为如此,最终系统才能区分:

  • • finished and verified
  • • finished but unverified

十一、第七步:最终输出一定要带证据

如果一个 Agent 最后只说:

任务完成了

那它从工程角度几乎没有可信度。

所以我们在 mini_agent/verify/finalizer.py 里做了一件非常重要的事:

把最终结果改成带 evidence 的结果。

例如:

classFinalizer:def_display_status(self, state: RunState) -> str:if state.status != "finished":return state.statusif state.modified_files:if state.verification_passed isTrue:return"finished and verified"return"finished but unverified"return"finished"

然后在 evidence 里追加:

  • • 发生过哪些工具调用
  • • 改了哪些文件
  • • 跑了哪些验证命令
  • • 当前验证状态是什么

这一步的价值在于,它重新定义了 Agent 的“完成”:

  • • 不是模型说完成就算完成
  • • 而是系统有证据支撑,才算完成

十二、第八步:把它做成一个真正可用的本地 CLI

当核心 Agent Loop 和工具闭环成立之后,最后一步才是把它变成一个可用的产品。

当前项目在 mini_agent/cli.py 里做了几件很实用的事:

1. 支持单次任务模式

例如:

python -m mini_agent.cli --workspace . "read README.md and summarize it"

2. 支持多轮 --chat

聊天模式下,会进入一个 REPL 循环:

defrun_chat_loop(    runner,    input_func=input,    print_func=print,    status_stream=None,    spinner_interval: float = 0.1,) -> int:    ...whileTrue:        user_input = input_func("mini-agent> ").strip()        ...        answer = runner.run(user_input, conversation_history=conversation_history)        print_func(answer)        conversation_history.append({"role""user""content": user_input})        conversation_history.append({"role""assistant""content": answer})

这意味着用户看到的是一个多轮 agent,系统内部则仍然保持“一次请求,一次 run”的简单模型。

3. 支持 spinner

如果用户输入之后终端没有反应,会很容易误以为程序卡住了。

所以我们加了一个很轻的工作提示:

defspinner_worker() -> None:    frames = "|/-\\"    index = 0whilenot stop_spinner.is_set():        frame = frames[index % len(frames)]        status_stream.write(f"\rWorking {frame}")        ...

从工程角度看,这不是核心能力。

但从产品体验看,它非常重要。

4. 支持 .env.local

这一步也很关键。因为本地使用 Agent 时,如果每次都要手动设置一堆环境变量,会非常难用。

所以当前 CLI 支持从 .env.local 读取:

  • • provider 配置
  • • 模型配置
  • • 本地行为开关

例如:

MINI_AGENT_AUTO_APPROVE_WRITES=true

这意味着写代码动作可以自动批准,而运行命令仍然保留人工边界。

十三、我们是怎么一步步把这个项目做出来的

如果回头看整个实现过程,这个 Mini Agent 不是一口气写出来的,而是按最小风险路径一步步搭起来的。

大致顺序是这样的:

第一步:先把最小 Loop 跑起来

只实现:

  • • RunState
  • • ModelTurn
  • • ToolCall
  • • Runner

目标只有一个:让 Agent 能进入循环。

第二步:加最小读工具

先做:

  • • list_files
  • • read_file

因为 Agent 必须先看见工作区,后面才谈得上写代码。

第三步:加写文件能力

先有:

  • • write_file

再演进到:

  • • apply_patch

这一步让系统从“能生成文件”变成“能更稳地修改文件”。

第四步:加审批和边界

这一步是整个系统开始有“工程感”的分水岭。

Agent 从这里开始不再是一个无边界执行器,而是一个受控系统。

第五步:加写后验证闭环

这一步非常关键。

它决定了系统到底是:

  • • 一个代码生成器

还是:

  • • 一个最小 Coding Agent

第六步:接真实模型

等内核稳定以后,再接 OpenAI-compatible provider。

做到这里你会发现,模型接入本身并不是最难的。

真正困难的是前面的:

  • • 工具协议
  • • 状态管理
  • • 边界控制
  • • 结果验证

第七步:补 CLI 体验

最后再去做:

  • • --chat
  • • spinner
  • • .env.local
  • • 自动批准写入

这些不是 Agent 的核心,但它们决定了系统能不能被真正长期使用。

十四、当前这个 Mini Agent 已经具备什么能力

如果你现在把这个项目跑起来,它已经能完成很多非常真实的本地任务。

包括:

  • • 以本地单进程 CLI 方式运行
  • • 接入真实 OpenAI-compatible 模型
  • • 查看工作区文件和目录
  • • 在工作区内写文件和打补丁
  • • 在受控边界内执行验证命令
  • • 做多轮 chat
  • • 显示工作中的 spinner
  • • 从 .env.local 读取本地配置
  • • 根据证据输出最终结果
  • • 区分“已验证完成”和“未验证完成”

对于一个从 0 到 1 的 Mini Agent 来说,这已经是一个非常完整的 MVP。

十五、如果继续往前走,一个完整 Agent 还应该具备什么能力

当前这个版本已经足够帮助你理解和实践最小 Agent,但如果你想继续演进,一个更完整的 Agent 还应该逐步具备这些能力:

1. Planning

现在的 Runner 还是“边想边做”。

更完整的 Agent 应该先产出一个小计划,再执行。

2. Scratchpad

需要显式的短期任务状态,例如:

  • • 当前子任务
  • • 已完成步骤
  • • 当前阻塞
  • • 待验证项

3. 更强的 Repo Context

现在主要还是依赖:

  • • list_files
  • • read_file

后续如果要支持更大项目,需要逐步引入:

  • • 检索
  • • AST 粒度切分
  • • 依赖关系
  • • 增量索引

4. 更细的失败处理

不仅要知道失败了,还要知道失败属于:

  • • 代码问题
  • • 环境问题
  • • 测试问题
  • • 工具问题

5. 轨迹可视化

更完整的 Agent 应该能告诉用户:

  • • 每一步做了什么
  • • 为什么这么做
  • • 当前停在哪一步

6. 更强验证能力

现在验证主要还是命令级。

更完整的版本可能还需要:

  • • 浏览器验证
  • • 接口验证
  • • 截图比较
  • • 端到端测试

十六、最后总结

从 0 到 1 实现一个 Mini Agent,不需要一开始就做成复杂平台。

真正正确的顺序是:

  1. 1. 先定义最小闭环
  2. 2. 先把 Agent Loop 跑通
  3. 3. 再补最小工具集
  4. 4. 尽早加入工程边界
  5. 5. 再把写后验证闭环做起来
  6. 6. 最后再补本地交互体验

如果只记住一句话,我希望是这句:

Mini Agent 不是一个“会生成代码的聊天机器人”,而是一个“能在受控环境里读取上下文、执行动作、修改代码、做验证并输出证据”的最小执行系统。

当你把这件事做对了,后面的 Planner、Scratchpad、Repo 索引,甚至多 Agent,才有继续演进的基础。

最新文章

随机文章

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