乐于分享
好东西不私藏

AFSim_Ai应用_搭建OpenHarness的简单客户端

AFSim_Ai应用_搭建OpenHarness的简单客户端

搭建OpenHarness的简单客户端

1

 前言

前段时间写了一篇怎么在wizard插件里面集成Python执行环境并与大模型进行简单对话的文章《大模型对话Python环境集成》。后来研究Harness时看到Github上介绍Claude Code的框架设计从0通过Python实现其核心模块的系列文章(Learn Claude Code)大受启发。然后经过周老师的提醒,在本地安装了OpenHarness来研究与afsim的结合。
对于学习来说,沿着(Learn Claude Code)一步步实现Harness是最好的,因为实现的都是最核心的内容,能更深入的理解其设计思想,精简的才能更好的来理解,不必被一些暂时用不到的功能分散注意力。
本文做的是开发一个warlock客户端通过子进程调用CLI的方式来集成OpenHarness输出到界面的,请往下看。

2

 OpenHarness

1)库介绍

OpenHarness(简称oh)是由香港大学HKUDS团队开发的一个轻量级基于Python的AIAgent基础设施框架,实现了完整的AgentHarness模式——即调用LLM使其成为功能性Agent所需的全部基础设施,包括工具调用、技能系统、记忆、权限治理和多Agent协调等等。

目录结构如下:

源码安装的目录如下,pip安装的有些许不同。

架构:

2)pip安装

直接通过pip安装,简单快捷:

pip install openharness-ai

安装后的目录为:

C:\Python\Python312\Lib\site-packages\openharness

这种安装法与源码安装法有些模块会有些差别,但核心模块都是一样的。

3)源码安装

环境要求:

Python 3.11+Node.js 18+大模型API Key

通过下面的命令安装:

# 安装uvpip install uv -i https://mirrors.aliyun.com/pypi/simple# 克隆项目git clone https://github.com/HKUDS/OpenHarness.gitcd OpenHarness# 安装依赖,看网速了,科学的话应该会快点(做个docker镜像???)uv sync --extra dev# 启动uv run openh

4)配置模型

OpenHarness 支持三种主流供应商 API:Anthropic、OpenAI-compatible、GitHub Copilot。这里以兼容的OpenAi来配置:

打开命令行工具运行oh setup,然后选择供应商配置即可。(源码安装方式可通过PyCharm打开项目)

配置完成,再运行openh -p “你是谁”测试,成功输出表示配置完成

或者直接运行openh进入交互模式:

以上就安装完了OpenHarness这个开源库。下面来实现通过Python来与oh进行交互。

3

 OpenHarness客户端

本身oh提供了基于控制台的CLI环境,但我们是希望集成到afsim的界面里去,那么就需要创建一个类似于客户端的方式来与oh的CLI环境进行交互,主要有下面几种方式:

1)直接Python环境集成

之前的文章就是将Python环境集成到了afsim插件中,还说可以基于此来做后续扩展^_^。这种方式虽然能够解决与LLM对话的基本功能,但走到后面发现还是隔离开来比较好,一方面是集成在一起时调试是一个问题,二来需要添加很多接口,容易出错。

2)通过在oh中添加http服务器

通过在oh框架中添加一个http服务器,afsim端通过http与oh进行交互,架构如下:

这种方式我没有尝试,主要是我对Python不是很熟,还是通过C++来写更适合我。我打算从0按着开篇提到的那个Harness的实现路径来搭建一套纯C++版的,不是为了工程应用,是为了学习。

3)通过子进程调用CLI

这种方式适用于任何语言,核心交互方式是通过 CLI 命令 oh。这里主要创建一个类OpenHarnessClient。

// OpenHarnessClient.h#pragma once#include<string>#include<functional>#include<memory>#include<vector>#ifdef _WIN32#define POPEN _popen#define PCLOSE _pclose#else#define POPEN popen#define PCLOSE pclose#endif// OpenHarness 输出格式常量namespace OHOutputFormat {    constexpr const char* TEXT = "text";           // 纯文本    constexpr const char* JSON = "json";           // 完整 JSON    constexpr const char* STREAM_JSON = "stream-json"// 流式 JSON 事件}// 流式事件类型(对应 --output-format stream-json)enum class OHEventType {    TEXT_DELTA,         // 文本增量    TOOL_START,         // 工具开始执行    TOOL_END,           // 工具执行完成    TOOL_OUTPUT,        // 工具输出    RESULT,             // 最终结果    ERR,                // 错误    Assistant_delta,    // 助手消息    Assistant_complete, // 助手消息完成    UNKNOWN};// 流式事件结构struct OHEvent {    OHEventType type;    std::string content;    std::string tool_name;    std::string tool_input;    std::string tool_output;    int tool_id = -1;};// OpenHarness 客户端class OpenHarnessClient {public:using StreamCallback = std::function<void(const OHEvent& event)>;    OpenHarnessClient();~OpenHarnessClient();    // 设置配置文件路径(可选)voidsetConfigPath(const std::string& path);    // 设置工作目录voidsetWorkingDirectory(const std::string& cwd);    // 设置权限模式voidsetPermissionMode(const std::string& mode)// default, auto, plan    // 同步执行:等待完整结果后返回    std::string query(const std::string& prompt,        const std::string& outputFormat = OHOutputFormat::JSON);    // 流式执行:实时回调每个事件voidqueryStream(const std::string& prompt, StreamCallback callback);    // 取消当前执行voidcancel();private:    std::string buildCommand(const std::string& prompt,        const std::string& outputFormat) const;    std::string parseJsonResult(const std::string& jsonOutput);voidparseStreamLine(const std::string& line, StreamCallback& callback);    class Impl;    std::unique_ptr<Impl> pImpl;};
// OpenHarnessClient.cpp#include"OpenHarnessClient.h"#include<cstdio>#include<array>#include<thread>#include<atomic>#include<sstream>#include<regex>#include<nlohmann/json.hpp>// 需要安装 nlohmann/json#ifdef _WIN32#include<windows.h>#else#endifusing json = nlohmann::json;class OpenHarnessClient::Impl {public:    std::string configPath;    std::string workingDir;    std::string permissionMode = "default";    std::atomic<bool> cancelled{false};    std::string buildBaseCommand()const{        std::string cmd = "oh";        // 添加权限模式        if (permissionMode == "auto") {            cmd += " --permission-mode auto";        } else if (permissionMode == "plan") {            cmd += " --permission-mode plan";        }        // 添加配置文件        if (!configPath.empty()) {            cmd += " --settings \"" + configPath + "\"";        }        return cmd;    }};OpenHarnessClient::OpenHarnessClient() pImpl(std::make_unique<Impl>()) {}OpenHarnessClient::~OpenHarnessClient() = default;voidOpenHarnessClient::setConfigPath(const std::string& path){    pImpl->configPath = path;}voidOpenHarnessClient::setWorkingDirectory(const std::string& cwd){    pImpl->workingDir = cwd;}voidOpenHarnessClient::setPermissionMode(const std::string& mode){    pImpl->permissionMode = mode;}voidOpenHarnessClient::cancel(){    pImpl->cancelled = true;}std::string OpenHarnessClient::buildCommand(const std::string& prompt,                                              const std::string& outputFormat) const {    // 转义 prompt 中的特殊字符    std::string escapedPrompt = prompt;    std::regex quote(R"(")");    escapedPrompt = std::regex_replace(escapedPrompt, quote, R"(\")");    std::string cmd = pImpl->buildBaseCommand();    cmd += " -p \"" + escapedPrompt + "\"";    cmd += " --output-format " + outputFormat;    return cmd;}std::string OpenHarnessClient::query(const std::string& prompt,                                       const std::string& outputFormat) {    pImpl->cancelled = false;    std::string cmd = buildCommand(prompt, outputFormat);    // 添加工作目录切换    std::string fullCmd;    if (!pImpl->workingDir.empty()) {#ifdef _WIN32        fullCmd = "cd /d \"" + pImpl->workingDir + "\" && " + cmd;#else        fullCmd = "cd \"" + pImpl->workingDir + "\" && " + cmd;#endif    } else {        fullCmd = cmd;    }    std::array<char, 4096> buffer;    std::string result;#ifdef _WIN32    //隐藏一个控制台窗口,使得在之后用popen来启shell窗口的时候,不显示黑窗口,或者避免黑窗口一闪而过的情况    AllocConsole();    //为调用进程分配一个新的控制台    ShowWindow(GetConsoleWindow(), SW_HIDE);    //隐藏自己创建的控制台#else    fullCmd = "cd \"" + pImpl->workingDir + "\" && " + cmd;#endif    FILE* pipe = POPEN(fullCmd.c_str(), "r");    if (!pipe) {        return "Error: Failed to execute command";    }    while (fgets(buffer.data(), buffer.size(), pipe) != nullptr) {        if (pImpl->cancelled) break;        result += buffer.data();    }    PCLOSE(pipe);    // 解析 JSON 结果    if (outputFormat == OHOutputFormat::JSON) {        return parseJsonResult(result);    }    return result;}std::string OpenHarnessClient::parseJsonResult(const std::string& jsonOutput){    try {        json j = json::parse(jsonOutput);        if (j.contains("text")) {            return j["text"].get<std::string>();        } else if (j.contains("content")) {            return j["content"].get<std::string>();        } else if (j.contains("result")) {            return j["result"].get<std::string>();        }        return j.dump();    } catch (const std::exception& e) {        // 非 JSON 格式,直接返回原文        return jsonOutput;    }}voidOpenHarnessClient::parseStreamLine(const std::string& line, StreamCallback& callback){    if (line.empty()) return;    OHEvent event;    try {        // stream-json 格式:每行一个 JSON 事件        json j = json::parse(line);        std::string type = j.value("type""");        if (type == "tool_started") {            event.type = OHEventType::TOOL_START;            event.tool_name = j.value("tool", j.value("tool_name"""));            event.tool_input = j.value("input", j.value("input"""));            event.tool_id = j.value("id"-1);        }        else if (type == "tool_completed") {            event.type = OHEventType::TOOL_END;            event.tool_name = j.value("tool", j.value("tool_name"""));            event.tool_output = j.value("output", j.value("output"""));            event.tool_id = j.value("id"-1);        }        else if (type == "error") {            event.type = OHEventType::ERR;            event.content = j.value("message", j.value("error"""));        }        else if (type == "assistant_delta") {            event.type = OHEventType::Assistant_delta;            event.content = j.value("text", j.value("text"""));        }        else if (type == "assistant_complete") {            event.type = OHEventType::Assistant_complete;            event.content = j.value("text", j.value("text"""));        }        else {            event.type = OHEventType::UNKNOWN;            event.content = line;        }    }     catch (const std::exception& e) {        // 非 JSON 格式,作为普通文本处理        event.type = OHEventType::TEXT_DELTA;        event.content = line;    }    callback(event);}voidOpenHarnessClient::queryStream(const std::string& prompt, StreamCallback callback){    pImpl->cancelled = false;    std::string cmd = buildCommand(prompt, OHOutputFormat::STREAM_JSON);    std::string fullCmd;    if (!pImpl->workingDir.empty()) {#ifdef _WIN32        fullCmd = "cd /d \"" + pImpl->workingDir + "\" && " + cmd;#else        fullCmd = "cd \"" + pImpl->workingDir + "\" && " + cmd;#endif    } else {        fullCmd = cmd;    }    std::array<char, 16384> buffer;  // 更大的缓冲区    std::string lineBuffer;#ifdef _WIN32    //隐藏一个控制台窗口,使得在之后用popen来启shell窗口的时候,不显示黑窗口,或者避免黑窗口一闪而过的情况    AllocConsole();    //为调用进程分配一个新的控制台    ShowWindow(GetConsoleWindow(), SW_HIDE);    //隐藏自己创建的控制台#else    fullCmd = "cd \"" + pImpl->workingDir + "\" && " + cmd;#endif    FILE* pipe = POPEN(fullCmd.c_str(), "r");    if (!pipe) {        OHEvent errEvent;        errEvent.type = OHEventType::ERR;        errEvent.content = "Failed to execute command";        callback(errEvent);        return;    }    // 逐字符读取以支持实时输出(流式)    char ch;    while (fread(&ch, 11, pipe) == 1) {        if (pImpl->cancelled) break;        if (ch == '\n') {            if (!lineBuffer.empty()) {                parseStreamLine(lineBuffer, callback);                lineBuffer.clear();            }        } else {            lineBuffer += ch;        }        // 刷新输出缓冲区,确保实时性        fflush(stdout);    }    // 处理最后一行    if (!lineBuffer.empty()) {        parseStreamLine(lineBuffer, callback);    }    PCLOSE(pipe);}

然后简单的流式输出调用如下:

int main() {    OpenHarnessClient client;    client.setPermissionMode("default");  // 敏感操作需确认    std::cout << "开始执行任务...\n" << std::endl;    client.queryStream("你是谁",        [](const OHEvent& event) {            switch(event.type) {            case OHEventType::TOOL_START:                std::cout << "\n [工具开始] " << event.tool_name << std::endl;                break;            case OHEventType::TOOL_END:                std::cout << "\n [工具完成] " << event.tool_name << std::endl;                break;            case OHEventType::ERR:                std::cerr << "\n [错误] " << event.content << std::endl;                break;            case OHEventType::Assistant_delta:            {                // 实时输出文本,不换行                QTextCodec* pCodec = QTextCodec::codecForName("gb2312");                if(!pCodec) return "";                QByteArray arr = pCodec->fromUnicode(event.content.c_str());                std::string cstr = arr.data();                std::cout << cstr;                std::cout.flush();            }                break;            case OHEventType::Assistant_complete:            {                // event.content 为完整内容,无需再次打印                std::cerr << "\n√ [完成] " << std::endl;                break;            }                break;            default:                std::cout << event.content;                break;            }        }    );    std::cout << "\n\n任务执行完毕" << std::endl;    return 0;}

以上代码通过编译器编译后即可运行。下面将OpenHarnessClient这个类继承到warlock插件里面去,并将数据输出到界面去。

4

集成到Warlock

理论上应该是搭建为wsf_plugin的,这样就能在后台引擎中来驱动,而不是与warlock绑定。我这里为了偷懒就直接放到warlock去了,这样既可以直接调用afsim的api,也能有个界面可以直接显示^_^,因为界面只是输入和输出不涉及核心逻辑,要剥离出来放到wsf_plugin里面也比较容易,要增加的只是界面与wsf_plugin的数据传输,其他的逻辑基本不用怎么大改,再议^_^,请查看《天线方向图实时绘制插件文章来搭建warlock插件。
这里界面我直接沿用了上一篇的界面就两个QTextEdit,一个输入,一个输出,用LLM自动就能搭出来。将上面的OpenHarnessClient的实现文件添加到插件源码中。界面点击发送按钮时将用户输入发送到OpenHarnessClient的实例,并实时接收回复并展示即可。

注:需要把OpenHarnessClient改为线程执行,不然会阻塞界面线程,造成的效果就是流式输出感觉不是流式的,会在回复完成后一次性显示出来,这是上一篇提过的。

下面是完成后的演示:

已关注
关注
重播 分享

这个工具目前有下面一些问题:

1、字符编码有些问题2、界面显示也很丑^_^3、没有会话保持4、没有退出保存和启动恢复会话5、没有添加任何Memory、Skills、Tools等

基本上就是个空的oh框架通过子进程方式集成到了afsim,如果大家有需要可以下载参考参考,虽然熟悉一点Python,但只能说勉强上手,对于开发复杂度较高的项目,就会捉襟见肘,因此本文的代码插件后续不再维护,我将构建的插件打包分享给大家。

5

后记

上面实现了OpenHarness这个开源库通过子进程调用的方式集成CLI输出到warlok界面,但这只是基本的集成工作,还需要针对不同的消息做一些界面显示上的修改,比如:

对涉及到需要权限确认的选择;

对LLM返回的不同数据类型做不同的标注显示等;

对文件修改等等都需要进一步的优化和完善的。

然后主要的工作就是Harness本身的开发了,如Skills、MCP、Tools、SubAgent等等与智能强相关的内容,这些不是本文能讲完的,需要大家在工作中逐步开展的。

最后想说的是:对LLM与afsim相结合的摸索对于仅有闲余时间且不太熟悉Python的我来说,进度实在是比较慢,整理的内容也没什么质量^_^,最近我才醒悟过来,我没办法在这种状态下思考出LLM解决实际工程问题的方法,我的初衷是了解LLM的开发范式,因此后续会以C++的方式来构建与LLM的交互及智能体相关的内容。

外部数据统一接入分发中间件

服务端仿真引擎框架

天线方向图实时绘制插件

wkf界面开发和插件扩展

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-07 17:42:42 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/724567.html
  2. 运行时间 : 0.199184s [ 吞吐率:5.02req/s ] 内存消耗:4,768.39kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=bc36df2cd2ae6408148bbe87f6bcb464
  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.000979s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001425s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.004214s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.002595s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001391s ]
  6. SELECT * FROM `set` [ RunTime:0.000728s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.002051s ]
  8. SELECT * FROM `article` WHERE `id` = 724567 LIMIT 1 [ RunTime:0.001611s ]
  9. UPDATE `article` SET `lasttime` = 1780825363 WHERE `id` = 724567 [ RunTime:0.007634s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.002085s ]
  11. SELECT * FROM `article` WHERE `id` < 724567 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000693s ]
  12. SELECT * FROM `article` WHERE `id` > 724567 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.003380s ]
  13. SELECT * FROM `article` WHERE `id` < 724567 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000721s ]
  14. SELECT * FROM `article` WHERE `id` < 724567 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004035s ]
  15. SELECT * FROM `article` WHERE `id` < 724567 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000809s ]
0.203143s