乐于分享
好东西不私藏

自定义前端页面与 OpenClaw 对话:技术实战指南

自定义前端页面与 OpenClaw 对话:技术实战指南

引言

OpenClaw 提供了功能完善的 Control UI(Web 控制面板),但在实际业务场景中,开发者往往需要将 AI 对话能力集成到自己的应用或系统中——比如企业内部的客服页面、CRM 系统的悬浮客服窗、或是特定业务流程的对话界面。

本文将深入讲解如何开发自定义前端页面,通过 WebSocket 协议直接与 OpenClaw Gateway 通信,实现与 AI Agent 的实时对话。

一、OpenClaw Gateway 架构回顾

在开始开发前,需要理解 OpenClaw 的核心架构:

  • Gateway:OpenClaw 的核心守护进程,负责管理所有通讯渠道和 AI Agent
  • WebSocket API:所有客户端(包括 Control UI、CLI、macOS app)都通过 WebSocket 与 Gateway 通信
  • 默认端口18789
  • 绑定地址:默认 127.0.0.1(loopback),可配置
[前端应用] <--WebSocket--> [Gateway :18789] <--> [AI Model]
                                     |
                         [WhatsApp/Telegram/Discord...]    

二、WebSocket 协议详解

2.1 协议格式

OpenClaw 使用 JSON 文本帧作为 WebSocket 通信格式。消息分为三类:

消息类型
方向
说明
req
客户端 → Gateway
请求消息
res
Gateway → 客户端
响应消息
event
Gateway → 客户端
服务端推送事件

2.2 连接握手

WebSocket 连接建立后,第一帧必须是 connect 请求

{
"type""req",
"id""conn-001",
"method""connect",
"params"{
"hello"{
"version""1.0",
"agentId""main",
"platform""web"
},
"auth"{
"token""your-gateway-token"
}
}
}

响应:

{
"type""res",
"id""conn-001",
"ok"true,
"payload"{
"hello""ok",
"snapshot"{
"presence"[...],
"health"{...}
}
}
}

2.3 核心 API 方法

与对话相关的核心方法:

方法
说明
chat.history
获取会话历史
chat.send
发送消息并触发 Agent 响应
chat.abort
中止正在进行的对话
chat.inject
向会话注入系统消息

三、自定义前端开发实战

3.1 项目结构

my-openclaw-chat/
├── index.html
├── styles.css
├── app.js
└── package.json (可选)

3.2 核心代码实现

第一步:建立 WebSocket 连接

class OpenClawClient {
constructor(options = {}) {
this.url = options.url || 'ws://127.0.0.1:18789';
this.token = options.token || '';
this.agentId = options.agentId || 'main';
this.ws = null;
this.requestId = 0;
this.handlers = new Map();
this.sessionKey = options.sessionKey || null;
  }

// 建立连接
connect() {
return new Promise((resolve, reject) => {
this.ws = new WebSocket(this.url);

this.ws.onopen = () => {
// 发送 connect 握手
this.sendRequest('connect', {
hello: {
version'1.0',
agentIdthis.agentId,
platform'web'
          },
auth: {
tokenthis.token
          }
        }).then(resolve).catch(reject);
      };

this.ws.onmessage = (event) => {
this.handleMessage(JSON.parse(event.data));
      };

this.ws.onerror = (error) => {
console.error('WebSocket error:', error);
reject(error);
      };

this.ws.onclose = (event) => {
console.log('WebSocket closed:', event.code, event.reason);
      };
    });
  }

// 发送请求
sendRequest(method, params = {}) {
return new Promise((resolve, reject) => {
const id = `req-${++this.requestId}`;

this.handlers.set(id, { resolve, reject });

this.ws.send(JSON.stringify({
type'req',
        id,
        method,
        params
      }));
    });
  }

// 处理消息
handleMessage(message) {
if (message.type === 'res' && message.id) {
const handler = this.handlers.get(message.id);
if (handler) {
if (message.ok) {
          handler.resolve(message.payload);
        } else {
          handler.reject(new Error(message.error || 'Unknown error'));
        }
this.handlers.delete(message.id);
      }
    } else if (message.type === 'event') {
this.handleEvent(message);
    }
  }

// 处理事件
handleEvent(event) {
console.log('Event:', event.event, event.payload);
// 根据事件类型处理
  }
}

第二步:获取会话历史

// 获取聊天历史
async getChatHistory(maxChars = 10000) {
const response = await this.sendRequest('chat.history', {
sessionKeythis.sessionKey,
    maxChars
  });
return response.messages || [];
}

响应数据结构:

{
"messages"[
{
"role""user",
"content""你好,请介绍一下自己"
},
{
"role""assistant",
"content""你好!我是..."
}
],
"sessionKey""agent:main:web:abc123"
}

第三步:发送消息

// 发送消息(流式响应)
async sendMessage(content, onChunk) {
const idempotencyKey = `msg-${Date.now()}-${Math.random()}`;

// 发送请求
const response = await this.sendRequest('chat.send', {
sessionKeythis.sessionKey,
message: {
role'user',
      content
    },
    idempotencyKey
  });

// 返回 runId 用于后续处理
return {
runId: response.runId,
status: response.status// "started"
  };
}

第四步:监听流式响应

// 在 handleEvent 中处理 agent 事件
handleEvent(event) {
if (event.event === 'agent') {
const { runId, state, summary, content } = event.payload;

switch (state) {
case 'streaming':
// 流式输出片段
if (onChunk) onChunk(content);
break;
case 'done':
// 完成
console.log('Agent response done:', summary);
break;
case 'error':
console.error('Agent error:', event.payload.error);
break;
    }
  } else if (event.event === 'chat') {
// 聊天消息事件
console.log('Chat event:', event.payload);
  }
}

3.3 完整前端示例

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OpenClaw 对话</title>
<style>
    * { box-sizing: border-box; }
body { 
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
max-width800pxmargin0 auto; padding20px;
background#f5f5f5;
    }
#chat-container {
background: white; border-radius12pxoverflow: hidden;
box-shadow2px 8px rgba(0,0,0,0.1);
    }
#messages {
height500pxoverflow-y: auto; padding20px;
    }
.message {
margin-bottom16pxpadding12px 16pxborder-radius8px;
max-width80%;
    }
.message.user {
background#007AFFcolor: white; margin-left: auto;
    }
.message.assistant {
background#E9E9EBcolor: black;
    }
.message.tool-call {
background#FFF3CDborder1px solid #FFEEBA;
font-size12pxfont-family: monospace;
    }
#input-area {
display: flex; padding16pxborder-top1px solid #eee;
gap12px;
    }
#message-input {
flex1padding12pxborder1px solid #ddd;
border-radius8pxfont-size16px;
    }
#send-btn {
padding12px 24pxbackground#007AFFcolor: white;
border: none; border-radius8pxcursor: pointer; font-size16px;
    }
#send-btn:disabled { background#ccc; }
.typing { color#666font-style: italic; }
</style>
</head>
<body>
<h1>🤖 OpenClaw AI 对话</h1>
<div id="chat-container">
<div id="messages"></div>
<div id="input-area">
<input type="text" id="message-input" placeholder="输入消息..." />
<button id="send-btn">发送</button>
</div>
</div>

<script>
// OpenClaw 客户端类(简化版)
class OpenClawChat {
constructor(token, sessionKey = null) {
this.url = 'ws://127.0.0.1:18789';
this.token = token;
this.sessionKey = sessionKey;
this.ws = null;
this.requestId = 0;
this.handlers = {};
this.onMessageCallback = null;
this.onToolCallCallback = null;
      }

async connect() {
return new Promise((resolve, reject) => {
this.ws = new WebSocket(this.url);

this.ws.onopen = () => {
this.sendRequest('connect', {
hello: { version'1.0'agentId'main'platform'web' },
auth: { tokenthis.token }
            }).then(resolve).catch(reject);
          };

this.ws.onmessage = (e) => this.handleMessage(JSON.parse(e.data));
this.ws.onerror = reject;
this.ws.onclose = () => console.log('Disconnected');
        });
      }

sendRequest(method, params) {
return new Promise((resolve, reject) => {
const id = `req-${++this.requestId}`;
this.handlers[id] = { resolve, reject };
this.ws.send(JSON.stringify({ type'req', id, method, params }));
        });
      }

handleMessage(msg) {
if (msg.type === 'res' && this.handlers[msg.id]) {
const h = this.handlers[msg.id];
          msg.ok ? h.resolve(msg.payload) : h.reject(new Error(msg.error));
delete this.handlers[msg.id];
        } else if (msg.type === 'event') {
if (msg.event === 'agent'this.handleAgentEvent(msg.payload);
else if (msg.event === 'chat'this.onMessageCallback?.(msg.payload);
        }
      }

handleAgentEvent(payload) {
if (payload.state === 'streaming') {
this.onChunkCallback?.(payload.content);
        }
      }

async sendMessage(content) {
const key = `msg-${Date.now()}`;
return this.sendRequest('chat.send', {
sessionKeythis.sessionKey,
message: { role'user', content },
idempotencyKey: key
        });
      }

async getHistory() {
return this.sendRequest('chat.history', { sessionKeythis.sessionKey });
      }
    }

// === 应用逻辑 ===
const TOKEN = 'your-gateway-token-here'// 替换为你的 Token

const chat = new OpenClawChat(TOKEN);
let currentAssistantMessage = null;

// UI 元素
const messagesDiv = document.getElementById('messages');
const input = document.getElementById('message-input');
const sendBtn = document.getElementById('send-btn');

// 添加消息到界面
function addMessage(role, content, isHtml = false) {
const div = document.createElement('div');
      div.className = `message ${role}`;
if (isHtml) div.innerHTML = content;
else div.textContent = content;
      messagesDiv.appendChild(div);
      messagesDiv.scrollTop = messagesDiv.scrollHeight;
return div;
    }

// 发送消息
async function send() {
const content = input.value.trim();
if (!content) return;

      input.value = '';
      sendBtn.disabled = true;

// 显示用户消息
addMessage('user', content);

// 显示 AI 响应占位
      currentAssistantMessage = addMessage('assistant''正在思考...');

try {
let assistantContent = '';

// 设置流式回调
        chat.onChunkCallback = (chunk) => {
          assistantContent += chunk;
          currentAssistantMessage.textContent = assistantContent;
        };

// 发送消息
await chat.sendMessage(content);

      } catch (error) {
        currentAssistantMessage.textContent = '错误: ' + error.message;
      } finally {
        sendBtn.disabled = false;
        chat.onChunkCallback = null;
      }
    }

// 初始化
async function init() {
try {
await chat.connect();
console.log('Connected to OpenClaw');

// 获取历史记录
const history = await chat.getHistory();
if (history.messages) {
          history.messages.forEach(msg => {
addMessage(msg.role, msg.content);
          });
        }

// 绑定事件
        sendBtn.onclick = send;
        input.onkeypress = (e) => { if (e.key === 'Enter'send(); };

      } catch (error) {
addMessage('assistant''连接失败: ' + error.message);
      }
    }

init();
</script>
</body>
</html>

四、设备配对与认证处理

4.1 配对机制

首次连接时,如果设备未配对,会收到错误:

{
"type""res",
"ok"false,
"error""pairing required"
}

解决方案:

# 1. 查看待配对请求
openclaw devices list

# 2. 审批设备
openclaw devices approve <requestId>

4.2 本地信任

本地连接(127.0.0.1 或 localhost自动信任,无需配对。

4.3 Token 获取

# 获取当前 Gateway Token
openclaw config get gateway.auth.token

五、远程访问方案

如果前端部署在不同于 Gateway 的服务器,需要通过 SSH 隧道或 Tailscale 访问。

5.1 SSH 隧道方案

# 在前端服务器上建立隧道
ssh -N -L 18789:127.0.0.1:18789 user@gateway-host

前端连接地址不变:ws://127.0.0.1:18789

5.2 Tailscale 方案

# 在 Gateway 主机上启用 Tailscale Serve
openclaw gateway --tailscale serve

前端连接地址:ws://<magicdns>:18789

六、安全最佳实践

6.1 认证安全

风险
防护措施
Token 泄露
最小化 Token 分发范围,定期轮换
中间人攻击
远程访问使用 SSH 隧道或 HTTPS
未授权访问
启用设备配对机制,配置白名单

6.2 配置建议

生产环境建议配置 gateway.trustedProxies

{
"gateway"{
"auth"{
"mode""token",
"token""your-secure-token"
}
}
}

6.3 前端安全

  • 不要在前端代码中硬编码 Token,建议通过后端代理转发
  • 使用环境变量管理敏感配置
  • 生产环境考虑部署后端 API 代理

七、进阶功能

7.1 工具调用展示

Agent 可能调用工具(搜索、执行命令等),前端应展示:

chat.onToolCallCallback = (toolCall) => {
addMessage('tool-call'`🔧 调用工具: ${toolCall.name}\n${JSON.stringify(toolCall.arguments)}`);
};

7.2 会话管理

// 创建新会话
const newSession = await chat.sendRequest('sessions.create', {
agentId'main',
mainKey'web'// 标识来源
});

// 切换会话
chat.sessionKey = newSession.sessionKey;

7.3 中断响应

// 中止正在进行的响应
await chat.sendRequest('chat.abort', {
sessionKey: chat.sessionKey
});

八、常见问题排查

问题
可能原因
解决方案
连接失败
Gateway 未运行
启动 openclaw gateway
认证失败
Token 错误
检查 gateway.auth.token
pairing required
设备未配对
执行 openclaw devices approve
消息发送失败
sessionKey 无效
检查会话是否正确初始化
远程连接超时
防火墙/隧道未建立
检查 SSH 隧道或 Tailscale 状态

结语

通过 WebSocket API,开发者可以完全脱离 Control UI,构建自定义的前端对话界面。核心要点总结:

  1. 协议层:基于 JSON 的 WebSocket 文本帧协议
  2. 认证:Token + 设备配对机制
  3. 核心方法chat.send(发送)、chat.history(历史)、chat.abort(中断)
  4. 远程访问:SSH 隧道或 Tailscale
  5. 安全:生产环境使用后端代理转发,避免前端暴露 Token

OpenClaw 的 WebSocket API 为企业提供了灵活的集成能力——无论是简单的客服对话框,还是复杂的 AI 驱动的业务流程,都可以基于此构建。


参考资料:OpenClaw 官方文档 https://docs.openclaw.ai

中小企业基于 OpenClaw 二次开发内部系统的可行性分析
不会写需求文档?让AI帮你搞定!手把手教你用AI写PRD,再交给AI开发
2026年OpenCode完全入门指南:从零开始用AI写代码
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-03 14:28:30 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/497732.html
  2. 运行时间 : 0.199891s [ 吞吐率:5.00req/s ] 内存消耗:4,779.63kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=ac7048b997d978fd65fa1e2f9979a522
  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.001215s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001967s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000730s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000634s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001654s ]
  6. SELECT * FROM `set` [ RunTime:0.000621s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001691s ]
  8. SELECT * FROM `article` WHERE `id` = 497732 LIMIT 1 [ RunTime:0.001375s ]
  9. UPDATE `article` SET `lasttime` = 1775197710 WHERE `id` = 497732 [ RunTime:0.001868s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000669s ]
  11. SELECT * FROM `article` WHERE `id` < 497732 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001210s ]
  12. SELECT * FROM `article` WHERE `id` > 497732 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001188s ]
  13. SELECT * FROM `article` WHERE `id` < 497732 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002278s ]
  14. SELECT * FROM `article` WHERE `id` < 497732 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004390s ]
  15. SELECT * FROM `article` WHERE `id` < 497732 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004638s ]
0.203719s