乐于分享
好东西不私藏

OpenClaw工具拆解之 edit+process

OpenClaw工具拆解之 edit+process

如果文章对你有帮助,请点个“关注”

一、edit 工具

1.1 工具概述

功能:精确编辑文件(替换指定文本)核心特性

  • • 必须精确匹配原文本(包括空白字符)
  • • 支持 9 个参数别名(path/oldText/newText 各 3 个别名)
  • • 编辑失败恢复机制(判断是否部分成功)
  • • 不匹配提示(显示当前文件内容)

1.2 工具创建链

createEditTool (外部库 @mariozechner/pi-coding-agent)    ↓wrapEditToolWithRecovery (编辑恢复机制)    ↓wrapToolParamNormalization (参数标准化)    ↓wrapToolWorkspaceRootGuard (工作目录限制)    ↓最终工具

1.3 编辑恢复机制

位置:第 114462 行

functionwrapEditToolWithRecovery(base, options) {return {        ...base,executeasync (toolCallId, params, signal, onUpdate) => {// 1. 读取参数const { pathParam, oldText, newText } = readEditToolParams(params);// 2. 解析绝对路径const absolutePath = typeof pathParam === "string" ? resolveEditPath(options.root, pathParam) : void0;// 3. 读取原始内容(用于恢复判断)let originalContent;if (absolutePath && newText !== void0) {try {                    originalContent = await options.readFile(absolutePath);                } catch {}            }// 4. 执行编辑try {returnawait base.execute(toolCallId, params, signal, onUpdate);            } catch (err) {// 5. 编辑失败,尝试恢复判断if (!absolutePath) throw err;let currentContent;try {                    currentContent = await options.readFile(absolutePath);                } catch {}// 6. 判断编辑是否已应用(部分成功)if (typeof currentContent === "string" && newText !== void0) {if (didEditLikelyApply({                        originalContent,                        currentContent,                        oldText,                        newText                    })) {// 编辑已应用,返回成功returnbuildEditSuccessResult(pathParam ?? absolutePath);                    }                }// 7. 添加不匹配提示if (typeof currentContent === "string" &&                     err instanceofError && shouldAddMismatchHint(err)) {throwappendMismatchHint(err, currentContent);                }throw err;            }        }    };}

1.4 参数标准化

位置:第 114541 行

// edit 工具参数分组constCLAUDE_PARAM_GROUPS = {edit: [        {keys: ["path""file_path""filePath""file"],label"path alias"        },        {keys: ["oldText""old_string""old_text""oldString"],label"oldText alias"        },        {keys: ["newText""new_string""new_text""newString"],label"newText alias",allowEmptytrue// newText 可以为空(删除文本)        }    ]};// edit 工具参数别名(9 个)constCLAUDE_PARAM_ALIASES = [// path 别名    { original"path"alias"file_path" },    { original"path"alias"filePath" },    { original"path"alias"file" },// oldText 别名    { original"oldText"alias"old_string" },    { original"oldText"alias"old_text" },    { original"oldText"alias"oldString" },// newText 别名    { original"newText"alias"new_string" },    { original"newText"alias"new_text" },    { original"newText"alias"newString" }];// 参数标准化函数functionnormalizeToolParams(params) {if (!params || typeof params !== "object"return;const normalized = { ...params };// 提取结构化文本(处理嵌套对象)for (const key of ["path""oldText""newText"]) {normalizeTextLikeParam(normalized, key);    }// 转换别名为标准参数normalizeClaudeParamAliases(normalized);return normalized;}

1.5 结构化文本提取

位置:第 114598 行

functionextractStructuredText(value, depth = 0) {if (depth > 6return;// 1. 直接是字符串if (typeof value === "string"return value;// 2. 数组类型if (Array.isArray(value)) {const parts = value.map((entry) =>extractStructuredText(entry, depth + 1)        ).filter((entry) =>typeof entry === "string");return parts.length > 0 ? parts.join("") : void0;    }// 3. 对象类型if (!value || typeof value !== "object"return;const record = value;if (typeof record.text === "string"return record.text;if (typeof record.content === "string"return record.content;if (Array.isArray(record.content)) {returnextractStructuredText(record.content, depth + 1);    }if (Array.isArray(record.parts)) {returnextractStructuredText(record.parts, depth + 1);    }// 4. 带 type 字段的对象if (typeof record.value === "string" && record.value.length > 0) {const type = typeof record.type === "string" ?             record.type.toLowerCase() : "";const kind = typeof record.kind === "string" ?             record.kind.toLowerCase() : "";if (type.includes("text") || kind === "text") {return record.value;        }    }}

1.6 编辑恢复判断

functiondidEditLikelyApply(params) {const { originalContent, currentContent, oldText, newText } = params;// 1. 如果没有原始内容,无法判断if (!originalContent) returnfalse;// 2. 如果 oldText 不再存在,且 newText 存在,可能已应用if (!currentContent.includes(oldText) && currentContent.includes(newText)) {returntrue;    }// 3. 如果内容发生了变化,可能部分应用if (originalContent !== currentContent) {returntrue;    }returnfalse;}functionbuildEditSuccessResult(filePath) {return {content: [{type"text",text`Successfully edited ${filePath}`        }],details: {path: filePath,status"success"        }    };}

1.7 不匹配提示

functionappendMismatchHint(err, currentContent) {const maxContextChars = 2000;const context = currentContent.length > maxContextChars ?         currentContent.slice(0, maxContextChars) + "\n...(truncated)..." :         currentContent;    err.message += `\n\nCurrent file content:\n\`\`\`\n${context}\n\`\`\``;    err.message += `\n\nMake sure oldText exactly matches the content you want to replace.`;return err;}functionshouldAddMismatchHint(err) {return err.message.includes("oldText") ||            err.message.includes("not found") ||           err.message.includes("no match");}

1.8 执行流程图

edit 工具调用    ↓1. 参数标准化   ├─ path/file_path/filePath/file → path   ├─ oldText/old_string/old_text/oldString → oldText   └─ newText/new_string/new_text/newString → newText    ↓2. 验证必填参数(path, oldText)    ↓3. 读取原始内容(用于恢复判断)    ↓4. 执行编辑(精确替换)   ├─ 查找 oldText(必须完全匹配)   ├─ 替换为 newText   └─ 保存文件    ↓5. 编辑失败处理   ├─ 读取当前内容   ├─ 判断编辑是否已部分应用   ├─ 是 → 返回成功   └─ 否 → 添加不匹配提示(显示当前内容)    ↓6. 返回结果

1.9 返回结果格式

成功

{"content":[{"type":"text","text":"Successfully edited src/main.py"}],"details":{"path":"src/main.py","status":"success"}}

失败(不匹配)

{"content":[{"type":"text","text":"Error: oldText not found in file.\n\nCurrent file content:\n```\ndef hello():\n    print('Hello')\n```\n\nMake sure oldText exactly matches the content you want to replace."}],"details":{"error":"oldText_not_found","path":"src/main.py"}}

二、process 工具

2.1 工具概述

功能:管理后台 exec 会话核心特性

  • • 8 个 actions(list/poll/log/write/send-keys/paste/submit/kill)
  • • 会话范围限制(scopeKey)
  • • 支持交互式输入(stdin)
  • • 支持按键发送(send-keys)

2.2 工具创建函数

位置:第 17108 行

functioncreateProcessTool(defaults) {if (defaults?.cleanupMs !== void0setJobTtlMs(defaults.cleanupMs);const scopeKey = defaults?.scopeKey;const supervisor = getProcessSupervisor();constisInScope = (session) => !scopeKey || session?.scopeKey === scopeKey;return {name"process",label"process",description"Manage running exec sessions: list, poll, log, write, send-keys, submit, paste, kill.",parameters: processSchema,executeasync (_toolCallId, args, _signal, _onUpdate) => {const params = args;// === action: list ===if (params.action === "list") {const running = listRunningSessions()                    .filter((s) =>isInScope(s))                    .map((s) => ({sessionId: s.id,status"running",pid: s.pid ?? void0,startedAt: s.startedAt,runtimeMsDate.now() - s.startedAt,cwd: s.cwd,command: s.command,namederiveSessionName(s.command),tail: s.tail,truncated: s.truncated                    }));const finished = listFinishedSessions()                    .filter((s) =>isInScope(s))                    .map((s) => ({sessionId: s.id,status: s.status,startedAt: s.startedAt,endedAt: s.endedAt,runtimeMs: s.endedAt - s.startedAt,cwd: s.cwd,command: s.command,namederiveSessionName(s.command),tail: s.tail,truncated: s.truncated,exitCode: s.exitCode ?? void0,exitSignal: s.exitSignal ?? void0                    }));return {content: [{type"text",text: [...running, ...finished]                            .toSorted((a, b) => b.startedAt - a.startedAt)                            .map((s) => {const label = s.name ? truncateMiddle(s.name80) : truncateMiddle(s.command120);return`${s.sessionId}${pad(s.status, 9)}${formatDurationCompact$1(s.runtimeMs) ?? "n/a"} :: ${label}`;                            })                            .join("\n") || "No running or recent sessions."                    }],details: {status"completed",sessions: [...running, ...finished]                    }                };            }// === 其他 action 需要 sessionId ===if (!params.sessionId) {return {content: [{ type"text"text"sessionId is required for this action." }],details: { status"failed" }                };            }const session = getSession(params.sessionId);const finished = getFinishedSession(params.sessionId);const scopedSession = isInScope(session) ? session : void0;const scopedFinished = isInScope(finished) ? finished : void0;constfailedResult = (text) => ({content: [{ type"text", text }],details: { status"failed" }            });constresolveBackgroundedWritableStdin = () => {if (!scopedSession) {return {okfalse,resultfailedResult(`No active session found for ${params.sessionId}`)                    };                }if (!scopedSession.backgrounded) {return {okfalse,resultfailedResult(`Session ${params.sessionId} is not backgrounded.`)                    };                }const stdin = scopedSession.stdin ?? scopedSession.child?.stdin;if (!stdin || stdin.destroyed) {return {okfalse,resultfailedResult(`Session ${params.sessionId} stdin is not writable.`)                    };                }return { oktruesession: scopedSession, stdin };            };constwriteToStdin = async (stdin, data) => {awaitnewPromise((resolve, reject) => {                    stdin.write(data, (err) => err ? reject(err) : resolve());                });            };// === action: poll ===if (params.action === "poll") {if (!scopedSession) {if (scopedFinished) {resetPollRetrySuggestion(params.sessionId);return {content: [{type"text",text: (scopedFinished.tail || `(no output recorded${scopedFinished.truncated ? " — truncated to cap" : ""})`) + `\n\nProcess exited with ${scopedFinished.exitSignal ? `signal ${scopedFinished.exitSignal}` : `code ${scopedFinished.exitCode ?? 0}`}.`                            }],details: {status: scopedFinished.status === "completed" ? "completed" : "failed",sessionId: params.sessionId,exitCode: scopedFinished.exitCode ?? void0,aggregated: scopedFinished.aggregated,namederiveSessionName(scopedFinished.command)                            }                        };                    }resetPollRetrySuggestion(params.sessionId);returnfailText(`No session found for ${params.sessionId}`);                }if (!scopedSession.backgrounded) {returnfailText(`Session ${params.sessionId} is not backgrounded.`);                }const pollWaitMs = resolvePollWaitMs(params.timeout);if (pollWaitMs > 0 && !scopedSession.exited) {const deadline = Date.now() + pollWaitMs;while (!scopedSession.exited && Date.now() < deadline) {awaitnewPromise((resolve) =>setTimeout(resolve, Math.max(0Math.min(250, deadline - Date.now())))                        );                    }                }const { stdout, stderr } = drainSession(scopedSession);const exited = scopedSession.exited;const exitCode = scopedSession.exitCode ?? 0;const exitSignal = scopedSession.exitSignal ?? void0;if (exited) {markExited(scopedSession, exitCode ?? null, exitSignal ?? null, status);                }const output = [stdout.trimEnd(), stderr.trimEnd()]                    .filter(Boolean)                    .join("\n")                    .trim();const hasNewOutput = output.length > 0;const retryInMs = exited ? void0 : recordPollRetrySuggestion(params.sessionId, hasNewOutput);if (exited) resetPollRetrySuggestion(params.sessionId);return {content: [{type"text",text: (output || "(no new output)") +                             (exited ? `\n\nProcess exited with ${exitSignal ? `signal ${exitSignal}` : `code ${exitCode}`}.` : "\n\nProcess still running.")                    }],details: {status: exited ? "completed" : "running",sessionId: params.sessionId,exitCode: exited ? exitCode : void0,aggregated: scopedSession.aggregated,namederiveSessionName(scopedSession.command),                        ...typeof retryInMs === "number" ? { retryInMs } : {}                    }                };            }// === action: log ===if (params.action === "log") {if (!scopedSession || !scopedSession.backgrounded) {return {content: [{ type"text"text`Session ${params.sessionId} is not backgrounded.` }],details: { status"failed" }                    };                }constwindow = resolveLogSliceWindow(params.offset, params.limit);const { slice, totalLines, totalChars } = sliceLogLines(                    scopedSession.aggregatedwindow.effectiveOffsetwindow.effectiveLimit                );const logDefaultTailNote = defaultTailNote(totalLines, window.usingDefaultTail);return {content: [{ type"text"text: (slice || "(no output yet)") + logDefaultTailNote }],details: {status: scopedSession.exited ? "completed" : "running",sessionId: params.sessionId,total: totalLines,                        totalLines,                        totalChars                    }                };            }// === action: write ===if (params.action === "write") {const { ok, stdin, session } = resolveBackgroundedWritableStdin();if (!ok) return stdin.result;awaitwriteToStdin(stdin, params.data);return {content: [{ type"text"text`Wrote ${params.data.length} bytes to stdin.` }],details: {status: session.exited ? "completed" : "running",sessionId: params.sessionId                    }                };            }// === action: send-keys ===if (params.action === "send-keys") {const { ok, stdin, session } = resolveBackgroundedWritableStdin();if (!ok) return stdin.result;const keys = params.keys || [];const hex = params.hex || [];const literal = params.literal;if (literal) {awaitwriteToStdin(stdin, literal);                } elseif (hex.length > 0) {const buffer = Buffer.from(hex.join(""), "hex");awaitnewPromise((resolve, reject) => {                        stdin.write(buffer, (err) => err ? reject(err) : resolve());                    });                } else {for (const key of keys) {const keyData = namedKeyMap.get(key.toLowerCase()) || key;awaitwriteToStdin(stdin, keyData);                    }                }return {content: [{ type"text"text`Sent keys to session.` }],details: { status"running"sessionId: params.sessionId }                };            }// === action: paste ===if (params.action === "paste") {const { ok, stdin, session } = resolveBackgroundedWritableStdin();if (!ok) return stdin.result;if (params.bracketed) {awaitwriteToStdin(stdin, BRACKETED_PASTE_START);                }awaitwriteToStdin(stdin, params.text);if (params.bracketed) {awaitwriteToStdin(stdin, BRACKETED_PASTE_END);                }return {content: [{ type"text"text`Pasted ${params.text.length} characters.` }],details: { status"running"sessionId: params.sessionId }                };            }// === action: submit ===if (params.action === "submit") {const { ok, stdin, session } = resolveBackgroundedWritableStdin();if (!ok) return stdin.result;                stdin.end();return {content: [{ type"text"text"Submitted EOF to stdin." }],details: { status"running"sessionId: params.sessionId }                };            }// === action: kill ===if (params.action === "kill") {if (!scopedSession) {return {content: [{ type"text"text`No active session found for ${params.sessionId}` }],details: { status"failed" }                    };                }const cancelled = cancelManagedSession(params.sessionId);if (!cancelled) {terminateSessionFallback(scopedSession);                }return {content: [{ type"text"text`Killed session ${params.sessionId}.` }],details: { status"killed"sessionId: params.sessionId }                };            }return {content: [{ type"text"text`Unknown action: ${params.action}` }],details: { status"failed" }            };        }    };}

2.3 支持的 Actions

Action
说明
参数
返回
list
列出所有会话
运行中 + 已完成的会话列表
poll
轮询状态
sessionId, timeout
最新输出 + 状态
log
读取日志
sessionId, offset, limit
指定范围的日志
write
写入 stdin
sessionId, data
写入字节数
send-keys
发送按键
sessionId, keys/hex/literal
成功状态
paste
粘贴文本
sessionId, text, bracketed
粘贴字符数
submit
发送 EOF
sessionId
成功状态
kill
终止会话
sessionId
成功状态

2.4 命名按键映射

const namedKeyMap = newMap([    ["enter""\r"],    ["return""\r"],    ["tab""\t"],    ["escape""\x1B"],    ["esc""\x1B"],    ["space"" "],    ["backspace""\x7F"],    ["up""\x1B[A"],    ["down""\x1B[B"],    ["right""\x1B[C"],    ["left""\x1B[D"],    ["home""\x1B[1~"],    ["end""\x1B[4~"],    ["pageup""\x1B[5~"],    ["pagedown""\x1B[6~"]]);

2.5 括号粘贴模式

constBRACKETED_PASTE_START = "\x1B[200~";constBRACKETED_PASTE_END = "\x1B[201~";// 作用:避免粘贴的文本被解释为命令// 例如:粘贴 "rm -rf /" 不会被立即执行

2.6 执行流程图

process 工具调用    ↓1. 检查 action 类型    ↓2. action=list   ├─ 获取运行中会话   ├─ 获取已完成会话   └─ 返回格式化列表    ↓3. 其他 actions(需要 sessionId)   ├─ 验证 sessionId   ├─ 检查会话范围(isInScope)   └─ 获取会话对象    ↓4. 根据 action 执行   ├─ poll → 轮询输出   ├─ log → 读取日志   ├─ write → 写入 stdin   ├─ send-keys → 发送按键   ├─ paste → 粘贴文本   ├─ submit → 发送 EOF   └─ kill → 终止会话    ↓5. 返回结果

三、关键机制对比

3.1 参数别名数量

工具
参数别名数量
别名类型
edit
9 个
path(3) + oldText(3) + newText(3)
process
0 个
无别名,所有参数都是标准名

3.2 错误恢复

特性
edit
process
恢复机制
判断编辑是否部分成功
不需要
不匹配提示
显示当前文件内容
不需要
会话恢复
不支持
轮询已退出会话

3.3 安全限制

限制类型
edit
process
工作目录限制
workspaceOnly
scopeKey
沙盒隔离
bridge 访问
会话隔离
路径边界检查
resolveEditPath
isInScope

四、使用示例

4.1 edit 工具调用

用户把 main.py 中的 print('Hello') 改为 print('Hello, World!')

大模型返回

{"tool_call":{"name":"edit","arguments":{"path":"main.py","oldText":"print('Hello')","newText":"print('Hello, World!')"}}}

执行结果(成功)

{"content":[{"type":"text","text":"Successfully edited main.py"}],"details":{"path":"main.py","status":"success"}}

执行结果(失败)

{"content":[{"type":"text","text":"Error: oldText not found in file.\n\nCurrent file content:\n```\ndef main():\n    print('Hi')\n```\n\nMake sure oldText exactly matches the content you want to replace."}],"details":{"error":"oldText_not_found","path":"main.py"}}

4.2 process 工具调用

用户查看后台运行的命令输出

大模型返回

{"tool_call":{"name":"process","arguments":{"action":"poll","sessionId":"abc123","timeout":5000}}}

执行结果

{"content":[{"type":"text","text":"Line 1\nLine 2\nLine 3\n\nProcess still running."}],"details":{"status":"running","sessionId":"abc123","aggregated":"Line 1\nLine 2\nLine 3\n"}}

如果文章对你有帮助,请点个“关注”

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-13 15:38:09 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/519737.html
  2. 运行时间 : 0.092929s [ 吞吐率:10.76req/s ] 内存消耗:4,735.05kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=374386049d1d4ad5aa2a68e751ad4008
  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.80 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000466s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000736s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000269s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000291s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000522s ]
  6. SELECT * FROM `set` [ RunTime:0.000207s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000598s ]
  8. SELECT * FROM `article` WHERE `id` = 519737 LIMIT 1 [ RunTime:0.000592s ]
  9. UPDATE `article` SET `lasttime` = 1776065889 WHERE `id` = 519737 [ RunTime:0.000706s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000223s ]
  11. SELECT * FROM `article` WHERE `id` < 519737 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000440s ]
  12. SELECT * FROM `article` WHERE `id` > 519737 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006474s ]
  13. SELECT * FROM `article` WHERE `id` < 519737 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001191s ]
  14. SELECT * FROM `article` WHERE `id` < 519737 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003746s ]
  15. SELECT * FROM `article` WHERE `id` < 519737 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004639s ]
0.094628s