乐于分享
好东西不私藏

元哥开讲:OpenClaw(十八)原理篇:手搓一个“微信”专属通道 (Custom Channel)

元哥开讲:OpenClaw(十八)原理篇:手搓一个“微信”专属通道 (Custom Channel)

各位兄弟,欢迎来到我们OpenClaw系列的最后一站。

在过去的十七篇文章里,我们一起走过了一段漫长而又精彩的旅程。我们从第一次认识“龙虾仔”,到亲手为它安家、赋予它技能、组建AI天团,再到将它部署成一个7x24小时的服务,最后甚至深入它的“引擎室”,窥探了其最底层的架构和安全哲学。

今天,作为我们这个系列的“毕业设计”,我们将挑战一个最能体现OpenClaw扩展精神的终极任务:从原理上,搞懂如何为OpenClaw手搓一个全新的自定义通道(Channel)

社区里已经有热心的开发者开源了接入企业微信的方案。但元哥我的目的,不是带大家去“抄”一个轮子,而是想“授人以渔”。我将以“接入企业微信”这个我们最关心的场景为例,带大家完整地走一遍,在创造一个新通道时,一个开发者脑子里需要思考的所有问题。

掌握了这种思考方式,未来无论你想把OpenClaw接入到QQ、钉钉,还是接入到你公司内部的某个聊天系统,甚至是接入你DIY的一个硬件,其底层的逻辑都是相通的。

一个通道(Channel)的本质是什么?

首先,我们得回归初心。我们在第四章就讲过,Gateway是“大总管”,而Channel是“五官”和“前台接待”。

所以,一个Channel插件的本质,就是一个“双向翻译官”“身份登记员”

  • 翻译官:它负责把外部平台(如企业微信)的“方言”,翻译成OpenClaw能听懂的“普通话”;再把OpenClaw的“普通话”,翻译回企业微信能听懂的“方言”。
  • 身份登记员:它负责搞清楚“来访者”(消息发送方)的身份,并为他创建一个唯一的、可追溯的“会话档案”(Session),确保AI能记住跟谁聊过什么。

无论一个通道写得多复杂,它要解决的,就是这三个最根本的问题。

灵魂拷问一:我该如何“听”?——消息的接收

这是所有问题的第一步:外部平台(企业微信)发生了新消息,我怎么才能知道?

在业界,通常有两种主流模式:

1. “你来找我”模式:Webhook(回调)

这是企业微信、钉钉、Slack等大多数平台采用的模式。

  • 工作方式:你需要在你的后台(也就是你的Channel插件服务)提供一个公开的URL地址。当有新消息时,由企业微信的服务器,主动向你的这个URL地址,发起一个HTTP请求。消息的内容,就放在这个请求的Body里。
  • 优点:简单直接,无状态。
  • 缺点:你的服务必须有一个公网可以访问的地址。对于我们把OpenClaw部署在家里的玩家来说,就需要用到“内网穿透”工具(比如ngrok或者我们在第十三章提到的Tailscale Funnel)来把家里的服务暴露出去。
  • 安全:为了确保这个请求真的是企业微信发的,而不是黑客伪造的,这种模式通常会带有一套“签名验证”机制。你需要用一个事先约定好的Token,对请求里的时间戳、随机数等参数进行加密计算,来验证“来访者”的合法性。

2. “我去找你”模式:WebSocket(长连接)

这是我们在第三章配置飞书时采用的模式。

  • 工作方式:你的Channel插件服务启动后,会主动地、像一个客户端一样,去连接企业微信的服务器,并建立一条长期、稳定的WebSocket连接。当有新消息时,由企业微信服务器,通过这条已经建立好的“管道”,把消息“推送”给你。
  • 优点:你的服务不需要公网IP!只要你能连得上网就行。对于个人开发者和家庭服务器玩家极其友好。
  • 缺点:需要在本地维持一个长连接,对程序的稳定性要求更高一些。

结论:在动手写一个新通道前,你必须先阅读目标平台的开发者文档,搞清楚它支持哪种消息接收模式,这将决定你整个插件的底层架构。对于企业微信,它主要用的就是Webhook模式

灵魂拷问二:我该如何“说”?——协议的适配

好了,现在我们收到企业微信发来的HTTP请求了。但这里面装的是一堆“天书”——一段加密的XML。而我们OpenClaw内部的Agent,它只认识标准化的InboundMessage对象。

所以,“翻译官”该上场了。这个过程分为“入”和“出”两个方向。

1. “入”的翻译:外部方言 → OpenClaw普通话

你的Channel插件,在收到企业微信的请求后,需要做以下几件事:

  • 解密:用事先约定好的EncodingAESKey,把加密的报文解开。
  • 解析:把解开后的XML文本,解析成程序可以理解的对象结构。
  • 提取:从这个复杂的对象里,提取出我们最关心的核心信息,比如:
    • FromUserName:谁发的?
    • MsgType:发的是啥?是文本(text)还是图片(image)?
    • Content / PicUrl:具体内容是什么?
    • ToUserName / AgentID:是发给哪个机器人应用的?
  • 封装:把这些提取出来的信息,塞进一个OpenClaw内部标准的InboundMessage对象里,然后交给Gateway。

2. “出”的翻译:OpenClaw普通话 → 外部方言

当AI思考完毕,Gateway把一个标准的OutboundMessage对象交给你时,你又得反向翻译一遍:

  • 解析:分析这个OutboundMessage,是要回复文本,还是要发送图片?
  • 封装:根据企业微信主动推送消息的API规范,把回复内容构造成它要求的JSON格式。
  • 认证:调用企业微信的API需要身份认证,你得用CorpIDSecret去换一个临时的access_token
  • 发送:带着这个access_token,向企业微信的“主动发消息”API地址,发起一个HTTP请求。

这个“翻译”过程,是一个通道插件最核心、工作量最大的部分。它考验的是你对两边API规范的理解和细心程度。

灵魂拷问三:我该如何“记”?——会话的管理

AI之所以能“记住”上下文,是因为OpenClaw为每一次对话都维护了一个独立的会话(Session)。而这个“会话”的唯一标识,就是sessionKey

一个通道插件的第三个核心职责,就是为每一条收到的消息,生成一个稳定且唯一的sessionKey

这个sessionKey通常由几个部分拼接而成:agentId:channelId:peerId

  • agentId
    channelId是固定的。
  • 最关键的就是peerId(对方ID)。

在企业微信的场景里:

  • 如果是一条私聊消息,那么这个peerId就应该是消息来源的FromUserName(员工ID)。
  • 如果是一条群聊消息,那么这个peerId就应该是这个群的ChatId

只有保证了同一个用户的私聊,或者同一个群的群聊,每次生成的sessionKey完全一样,AI的“记忆”才能得以延续。

如果这个Key生成错了,比如把所有消息都归到了同一个Key下,那就会发生“A问B答,张冠李戴”的“AI精神错乱”现象。

毕业设计:企业微信通道技术蓝图

光有思想还不够,元哥我再带大家把“蓝图”画出来。下面就是构建一个企业微信通道插件,你可能需要的具体设计。

1. 整体架构图

首先,我们得明白各个组件之间是怎么对话的。

这张图清晰地展示了,我们的自定义通道服务(Bridge),就是连接企业微信和OpenClaw网关的“桥梁”。

2. 核心时序图 (异步推送模式)

由于AI的思考需要时间,我们不能让企业微信的服务器一直傻等。所以,采用“立即响应,异步推送”的模式是最佳实践。

这张图揭示了核心交互流程:快速响应Webhook,然后通过内部调用获取AI结果,最后主动API推送给用户。

3. 代码结构蓝图

一个典型的企业微信通道插件,可能会是这样的文件结构(以TypeScript项目为例):

wecom-channel-plugin/├── src/│   ├── index.ts          # 插件入口, 负责注册和生命周期管理│   ├── server.ts         # Express或类似框架的服务器, 监听Webhook回调│   ├── crypto.ts         # 处理企业微信消息的加解密和签名验证│   ├── translator.ts     # 核心翻译逻辑, WeCom XML <-> OpenClaw Object│   └── api.ts            # 封装对企业微信主动推送API的调用├── package.json└── tsconfig.json

4. 核心逻辑伪代码

为了让大家看得更明白,元哥我把几个核心文件的大概逻辑用伪代码写出来。

server.ts (Webhook服务器)

// 使用 Express.js 举例import express from 'express';import { handleWeComGet, handleWeComPost } from './crypto';const app = express();// ... 使用中间件来解析原始的请求体 ...// 处理企业微信的GET验证请求, 这是配置URL时的一次性验证app.get('/wecom-callback', (req, res) => {  const echoStr = handleWeComGet(req.query);  if (echoStr) {    res.send(echoStr);  } else {    res.status(401).send('Signature validation failed');  }});// 处理企业微信POST的消息app.post('/wecom-callback', async (req, res) => {  // 关键第一步:立即响应, 告诉企微服务器“我收到了”,防止它重复推送  res.send('success');   // 异步地、在后台处理真正的消息逻辑  await handleWeComPost(req.body);});app.listen(3000, () => console.log('WeCom channel service listening on port 3000'));

translator.ts (翻译官)

// 这是一个假设的OpenClaw内部类型import { InboundMessage } from '@openclaw/core'; // 将解密后的WeCom XML消息, 转换为OpenClaw内部消息对象export function translateToOpenClaw(wecomXml: any): InboundMessage {  const fromUser = wecomXml.FromUserName;  const content = wecomXml.Content;  // ... 更多字段的提取和转换逻辑 ...  return {    peerId: fromUser, // 用发送者的ID作为对方ID    channel: 'wecom', // 标记消息来源    text: content,    // ... 其他OpenClaw需要的标准化字段  };}

api.ts (主动API调用模块)

let accessToken: string | null = null;let tokenExpiresAt: number = 0;// 获取并缓存AccessTokenasync function getAccessToken(): Promise<string> {  // 如果token没过期,直接用缓存的  if (Date.now() < tokenExpiresAt) {    return accessToken!;  }  // 如果过期了,就去企微服务器请求一个新的  const response = await fetch(`https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=YOUR_CORP_ID&corpsecret=YOUR_SECRET`);  const data = await response.json();  accessToken = data.access_token;  // 企微的token有效期是7200秒,我们留一点buffer  tokenExpiresAt = Date.now() + (data.expires_in - 120) * 1000;  return accessToken!;}// 主动发送文本消息给用户export async function sendTextMessage(userId: string, content: string) {  const token = await getAccessToken();  const url = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`;  const payload = {    touser: userId,    msgtype: 'text',    agentid: YOUR_AGENT_ID, // 你在企微后台创建的应用ID    text: {      content: content,    },  };  await fetch(url, {    method: 'POST',    body: JSON.stringify(payload),  });}

有了这份详尽的蓝图,相信真正的动手能力强的硬核玩家,已经知道该如何去打造自己的“轮子”了。

总结:“手搓”一个新通道的思考路径

看到这里,相信你已经明白了。创造一个新通道,虽然代码实现上细节繁多,但其核心的思考路径是清晰的:

  1. 研读文档:第一步永远是把你要接入的那个平台的“开发者文档”翻个底朝天,搞清楚它的认证方式、API规范、消息格式。
  2. 确定“听”的模式:是Webhook还是WebSocket?这决定了你的基础架构。
  3. 编写“翻译器”:实现“入”和“出”两个方向的数据格式转换。
  4. 定义“身份证”:设计sessionKey的生成规则,确保会话的唯一性和稳定性。
  5. 封装与部署:将你的代码封装成一个OpenClaw能识别的插件,并进行配置。

终章感言

从第一章到第十八掌,我们一起见证了“龙虾仔”从一个概念,到一个能跑通的玩具,再到一个拥有专家团队、具备多模态能力、可7x24小时服务的强大平台,最后,我们甚至拥有了能为其“开疆拓土”、接入全新生态的能力。

元哥我的系列文章到这里就正式画上句号了。但这绝不是结束,恰恰相反,它是一个全新的开始。

我为大家推开了一扇通往“个人AI助理”新世界的大门,门后的风景,需要你们自己去探索、去创造。去打造只属于你自己的“独门绝技”,去组建服务于你特定需求的“AI天团”,去把你身边所有能联网的设备都变成“龙虾仔”的“神经末梢”。

这个时代最激动人心的,不是我们能“用”多好的AI,而是我们能“创造”出什么样的AI。

江湖路远,我们有缘再会。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-29 11:35:29 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/489905.html
  2. 运行时间 : 0.211859s [ 吞吐率:4.72req/s ] 内存消耗:4,713.68kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=95535449dfa966fafc39081947bae1cf
  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.68 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.001014s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001513s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000724s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000667s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001329s ]
  6. SELECT * FROM `set` [ RunTime:0.000587s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001415s ]
  8. SELECT * FROM `article` WHERE `id` = 489905 LIMIT 1 [ RunTime:0.001741s ]
  9. UPDATE `article` SET `lasttime` = 1774755329 WHERE `id` = 489905 [ RunTime:0.002003s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000723s ]
  11. SELECT * FROM `article` WHERE `id` < 489905 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001094s ]
  12. SELECT * FROM `article` WHERE `id` > 489905 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001191s ]
  13. SELECT * FROM `article` WHERE `id` < 489905 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002255s ]
  14. SELECT * FROM `article` WHERE `id` < 489905 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.006398s ]
  15. SELECT * FROM `article` WHERE `id` < 489905 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002018s ]
0.215700s