乐于分享
好东西不私藏

手把手教你写MCP客户端:让AI替你调用工具,全自动对话机器人

手把手教你写MCP客户端:让AI替你调用工具,全自动对话机器人

前两篇文章,我们分别介绍了MCP的概念与架构,以及如何写MCP服务器

今天这篇是系列第三篇——MCP客户端开发。搞定这一篇,你就打通了MCP的完整链路:

服务器(暴露能力)← 客户端(连接调用)← AI模型(理解执行)

准备好了吗?开始!


一、什么是MCP客户端?它在整个架构中扮演什么角色?

先搞清楚概念:

组件
角色
类比
MCP服务器
暴露工具、资源、提示词
插座 — 提供电力
MCP客户端
连接服务器,转发请求/响应
插头 — 连接插座和设备
Host(宿主应用)
运行客户端的AI应用
电器 — 最终用户界面

一句话概括:

MCP客户端是AI应用与MCP服务器之间的"桥梁"。它负责连接服务器、发现能力、转发工具调用、处理返回结果。

客户端的核心职责

  1. 1. 连接管理 — 启动服务器进程,建立通信通道
  2. 2. 能力发现 — 列出服务器提供的工具、资源、提示词
  3. 3. 请求转发 — 将AI模型的意图转化为MCP协议请求
  4. 4. 响应处理 — 将服务器结果转回AI模型可理解的内容
  5. 5. 会话管理 — 维护对话上下文,支持多轮交互

客户端运行在哪里?

MCP客户端通常嵌入在Host应用中:

  • • Claude Desktop — Anthropic官方桌面客户端
  • • VS Code / Cursor — IDE内置的MCP支持
  • • 自定义聊天机器人 — 你自己写的Python/TypeScript程序
  • • 企业AI平台 — 集成MCP的内部系统

二、从零开始:Python实现完整聊天机器人

这是官方教程推荐的入门方式,代码量适中,功能完整。

📋 环境准备

# 1. 创建项目目录mkdir mcp-client && cd mcp-client# 2. 安装MCP SDK和依赖uv pip install "mcp[cli]" anthropic httpx

要求: Python 3.10+,最新版本的 uv

🔧 完整代码:MCP聊天机器人客户端

创建 client.py 文件:

import asyncioimport sysfrom contextlib import AsyncExitStackfrom anthropic import AsyncAnthropicfrom mcp.shared.session import Sessionfrom mcp.client.stdio import StdioClientSession, StdioServerParametersclass MCPClient:     """MCP客户端 - 连接服务器并调用工具"""    def __init__(self):        # 会话管理        self.exit_stack = AsyncExitStack()        self.session: Session | None = None         # AI模型客户端(以Claude为例)        self.anthropic = AsyncAnthropic()        self.messages = []  # 对话历史    # =====================    # 1. 连接到MCP服务器    # =====================    async def connect_to_server(self, server_script_path: str):         """连接到MCP服务器"""        # 判断服务器脚本类型        is_python = server_script_path.endswith(&#x27;.py&#x27;)        is_js = server_script_path.endswith(&#x27;.js&#x27;)        if not (is_python or is_js):            raise ValueError("服务器脚本必须是 .py 或 .js 文件")        # 设置启动命令        command = "python" if is_python else "node"        server_params = StdioServerParameters(            command=command,            args=[server_script_path],            env=None        )         # 建立stdio通信并初始化会话        stdio_transport = await self.exit_stack.enter_async_context(            asyncio.create_task(                StdioClientSession(server_params)             )       )        _, session_service = await stdio_transport.__aenter__()        self.session = await session_service         # 列出可用工具        response = await self.session.list_tools()        tools = response.tools        print(f"\n✅ 已连接到服务器,可用工具:")        for tool in tools:            print(f"   🔧 {tool.name}: {tool.description}")    # =====================    # 2. 处理对话循环    # =====================    async def chat_loop(self):         """交互式对话循环"""        print("\n💬 开始对话!(输入 &#x27;quit&#x27; 退出)")        while True:            try:                user_input = input("\n👤 你:").strip()                if user_input.lower() in (&#x27;quit&#x27;, &#x27;exit&#x27;, &#x27;退出&#x27;):                    break                await self.handle_query(user_input)             except KeyboardInterrupt:                break    # =====================    # 3. 处理用户查询(核心逻辑)    # =====================    async def handle_query(self, query: str):         """处理用户查询,调用AI模型并执行工具"""        self.messages.append({            "role": "user",            "content": query       })        # 将MCP工具格式化为Claude API需要的格式        mcp_tools = []        if self.session:            tools_response = await self.session.list_tools()            for tool in tools_response.tools:                mcp_tools.append({                    "name": tool.name,                    "description": tool.description,                    "input_schema": tool.inputSchema               })         # 调用AI模型        response = await self.anthropic.messages.create(            model="claude-sonnet-4-0",            max_tokens=4096,            messages=self.messages,            tools=mcp_tools if mcp_tools else None       )         # 处理AI响应        assistant_text = []        tool_results = []        has_text_response = False        for content in response.content:            if content.type == "text":                assistant_text.append(content.text)                print(f"\n🤖 AI:{content.text}")                has_text_response = True            elif content.type == "tool_use":                tool_name = content.name                tool_args = content.input                 # 执行工具调用                result = await self.session.call_tool(tool_name, tool_args)                tool_results.append({                    "call": tool_name,                    "result": result               })                print(f"\n🔧 [调用工具: {tool_name}, 参数: {tool_args}]")                 # 显示工具结果                for content_item in result.content:                    if content_item.type == "text":                        print(f"📋 工具结果:{content_item.text}")        # 如果调用了工具,将结果发回给AI进行二次处理        if tool_results:            self.messages.append({                "role": "assistant",                "content": assistant_text if assistant_text else [                    {"type": "tool_use", "name": r["call"],                     "input": {}, "id": "tool_call_1"}                ]           })             # 将工具结果作为用户消息返回给AI            tool_result_msg = {                "role": "user",                "content": [                    {"type": "tool_result", "content": r["result"].content}                    for r in tool_results               ]           }            self.messages.append(tool_result_msg)            # 二次调用AI模型,生成最终回答            final_response = await self.anthropic.messages.create(                model="claude-sonnet-4-0",                max_tokens=4096,                messages=self.messages           )            for content in final_response.content:                if content.type == "text":                    print(f"\n🤖 AI最终回答:{content.text}")    # =====================    # 4. 资源清理    # =====================    async def cleanup(self):         """清理资源,断开连接"""        await self.exit_stack.aclose()        print("\n👋 已断开服务器连接")# =====================# 程序入口# =====================async def main():    if len(sys.argv) < 2:        print("用法: python client.py <服务器脚本路径>")        sys.exit(1)    client = MCPClient()    try:        await client.connect_to_server(sys.argv[1])        await client.chat_loop()    finally:        await client.cleanup()if __name__ == "__main__":    import asyncio    asyncio.run(main())

🚀 运行客户端

# 假设你有一个服务器脚本 weather.pypython client.py ./weather.py

交互效果:

✅ 已连接到服务器,可用工具:   🔧 get-forecast: 获取指定位置的天气预报   🔧 get-alerts: 获取指定位置的天气警报信息💬 开始对话!(输入 &#x27;quit&#x27; 退出)👤 你:北京的天气怎么样?🤖 AI:让我帮你查一下北京的天气...🔧 [调用工具: get-forecast, 参数: {"latitude": 39.9, "longitude": 116.4}]📋 工具结果:天气预报:晴转多云,气温25-30度...🤖 AI最终回答:北京今天的天气是晴转多云,气温在25-30度之间,适合户外活动。

三、关键组件详解

1️⃣ 客户端初始化

class MCPClient:    def __init__(self):        self.exit_stack = AsyncExitStack()   # 资源管理        self.session: Session | None = None   # MCP会话        self.anthropic = AsyncAnthropic()     # AI模型客户端        self.messages = []                    # 对话历史

关键组件:

  • • AsyncExitStack — Python异步上下文管理器,确保资源正确释放
  • • Session — MCP会话对象,管理连接和通信
  • • messages — 对话历史列表,维持多轮对话的上下文

2️⃣ 服务器连接

async def connect_to_server(self, server_script_path: str):    # 1. 判断脚本类型(.py → python / .js → node)    command = "python" if is_python else "node"    # 2. 配置服务器参数    server_params = StdioServerParameters(        command=command,        args=[server_script_path],        env=None    )    # 3. 建立stdio传输通道    stdio_transport = await self.exit_stack.enter_async_context(...)    # 4. 获取会话对象    self.session = await session_service    # 5. 列出可用工具    response = await self.session.list_tools()

核心API:

API
作用
StdioServerParameters
配置服务器启动参数
StdioClientSession
建立stdio通信通道
session.initialize()
初始化会话
session.list_tools()
列出可用工具

3️⃣ 工具调用流程

用户输入 → AI模型分析意图 → 决定调用工具 → MCP客户端执行                                        ↓                                   服务器返回结果 → 客户端转发给AI                                        ↓                                 AI结合结果生成最终回答

关键代码:

# 将MCP工具格式化为Claude API需要的格式mcp_tools = []for tool in tools_response.tools:    mcp_tools.append({        "name": tool.name,              # 工具名称        "description": tool.description,  # 工具描述        "input_schema": tool.inputSchema  # 参数Schema    })# 调用AI模型,传入工具列表response = await self.anthropic.messages.create(    model="claude-sonnet-4-0",    tools=mcp_tools,      # ← 告诉AI有哪些工具可用    messages=self.messages)# 如果AI决定调用工具if content.type == "tool_use":    result = await self.session.call_tool(tool_name, tool_args)

4️⃣ 资源(Resources)访问

除了工具,客户端还可以访问服务器暴露的资源:

# 列出可用资源resources = await self.session.list_resources()# 读取特定资源内容content, mime_type = await self.session.read_resource("file:///some/path")

5️⃣ 提示词(Prompts)使用

# 列出可用提示词模板prompts = await self.session.list_prompts()# 获取具体提示词(带参数)prompt_result = await self.session.get_prompt("security-review", {    "code": "..."})

四、TypeScript实现(前端开发者必看)

如果你更习惯JavaScript/TypeScript,SDK也提供了完整的TS支持:

📋 环境准备

mkdir mcp-client-ts && cd mcp-client-tsnpm init -ynpm install @modelcontextprotocol/sdk node-fetch

🔧 TypeScript完整代码

创建 client.ts

import { Client } from "@modelcontextprotocol/sdk/client/index.js";import { StdioTransport } from "@modelcontextprotocol/sdk/client/stdio.js";import fetch from "node-fetch";async function main() {    // 1. 创建客户端实例    const client = new Client({        name: "my-mcp-client",        version: "1.0.0"    });    // 2. 连接服务器(stdio方式)    const transport = new StdioTransport({        command: "node",        args: ["./weather.js"]    });    await client.connect(transport);    // 3. 列出可用工具    const tools = await client.listTools();    console.log("✅ 可用工具:");    tools.tools.forEach(tool => {        console.log(`   🔧 ${tool.name}: ${tool.description}`);    });    // 4. 调用工具    const result = await client.callTool({        name: "get-forecast",        arguments: {            latitude: 39.9,            longitude: 116.4        }    });    console.log("\n📋 工具结果:");    result.content.forEach(item => {        if (item.type === "text") {            console.log(item.text);        }    });    // 5. 断开连接    await client.close();}main().catch(console.error);

⚡ TypeScript vs Python对比

维度
Python
TypeScript
SDKmcp
 (Python)
@modelcontextprotocol/sdk
 (npm)
连接方式StdioClientSessionStdioTransport
列出工具await session.list_tools()await client.listTools()
调用工具await session.call_tool(name, args)await client.callTool({name, arguments})
资源管理AsyncExitStack
 + aclose()
client.close()

五、两种传输方式:Stdio vs SSE/HTTP

📡 Stdio(标准输入输出)

适用场景: 本地服务器,客户端和服务器在同一台机器上

# Pythonserver_params = StdioServerParameters(    command="python",    args=["./weather.py"])

优点: 简单直接,零网络延迟 限制: 只能连接本地服务器

🌐 SSE(Server-Sent Events / HTTP)

适用场景: 远程服务器,需要跨机器通信

// TypeScript - SSE传输方式import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";const transport = new SSEClientTransport(    new URL("http://remote-server:3000/mcp"));await client.connect(transport);

优点: 支持远程连接,可跨网络 限制: 需要服务器支持HTTP/SSE传输

对比项
Stdio
SSE/HTTP
通信方式
进程间stdio
HTTP + SSE
适用场景
本地开发
远程服务
配置复杂度
简单
中等
延迟
极低(进程内)
网络延迟

六、客户端开发的完整流程总结

构建一个MCP客户端的核心流程如下:

第一步:初始化客户端

  • • Python: MCPClient() + AsyncExitStack
  • • TypeScript: new Client({...})

第二步:连接服务器

  • • 配置服务器参数(命令、路径)
  • • 选择传输方式(stdio或SSE)
  • • 建立通信通道并初始化会话

第三步:发现能力

  • • list_tools() — 列出可用工具
  • • list_resources() — 列出可用资源
  • • list_prompts() — 列出提示词模板

第四步:调用工具/资源

# 调用工具result = await session.call_tool("get-forecast", {    "latitude": 39.9, "longitude": 116.4})# 读取资源content, mime_type = await session.read_resource("file:///path/to/file")

第五步:整合AI模型

  • • 将工具列表格式化为AI API需要的格式
  • • 调用AI模型,传入对话历史和工具定义
  • • 解析AI响应,判断是否需要调用工具
  • • 执行工具调用,将结果返回给AI生成最终回答

第六步:资源清理

async def cleanup(self):    await self.exit_stack.aclose()  # Python

七、常见坑和注意事项

⚠️ 服务器路径问题

错误写法:

# Windows - 反斜杠可能导致问题python client.py C:\projects\weather.py

正确写法:

# 方式1:正斜杠(推荐)python client.py C:/projects/weather.py# 方式2:转义反斜杠python client.py C:\\projects\\weather.py# 方式3:绝对路径 + 引号python client.py "C:\projects\weather.py"

⚠️ 首次响应延迟

现象: 第一次对话可能需要 10-30秒 才有响应

原因:

  1. 1. 服务器进程初始化
  2. 2. AI模型处理查询
  3. 3. 工具执行时间

建议: 在初始等待期间不要中断进程,后续响应会快很多。

⚠️ API Key配置

# Claude API(示例)export ANTHROPIC_API_KEY="sk-ant-xxx"# OpenAI(如果用GPT的话)export OPENAI_API_KEY="sk-xxx"

⚠️ 错误处理

MCP协议规定: 工具级别的错误应在结果对象内报告,而不是作为协议级错误。

# ✅ 正确做法:在内容中返回错误return {    "content": [{"type": "text", "text": "操作失败:xxx"}],    "isError": True}

八、不同AI平台的客户端实现

Claude Desktop(无需写代码)

配置文件:~/Library/Application Support/Claude/claude_desktop_config.json

{   "mcpServers": {     "weather": {       "command": "python",       "args": ["/absolute/path/to/weather.py"]     }   }}

VS Code / Cursor(内置支持)

在设置中添加MCP服务器配置即可,无需额外编码。

Google Gemini集成

from google import genai# 将MCP工具转换为Gemini格式mcp_tools = await session.list_tools()gemini_tools = types.Tool(function_declarations=[    {        "name": tool.name,        "description": tool.description,        "parameters": tool.inputSchema    }    for tool in mcp_tools.tools])# 调用Gemini APIresponse = await client.aio.models.generate_content(    contents=[...],    tools=[gemini_tools])

九、总结

MCP客户端开发的本质就是做一个"翻译官"

角色
职责
对AI模型
把MCP服务器能力翻译成AI能理解的格式
对服务器
把AI的意图翻译成MCP协议请求
对用户
提供自然的交互界面(聊天、UI等)

核心API总结:

客户端生命周期:├── 初始化 → Client / MCPClient├── 连接   → connect() / StdioTransport├── 发现能力 → list_tools() / list_resources() / list_prompts()├── 调用工具 → call_tool(name, args)├── 读取资源 → read_resource(uri)└── 清理   → close() / aclose()

掌握了MCP客户端开发,你就拥有了连接任何MCP服务器的能力。一次编写,到处调用——这就是MCP的魅力。

下一步探索:

  • • 📚 深入阅读官方SDK文档,了解所有API细节
  • • 🔌 尝试HTTP/SSE传输,实现远程服务器连接
  • • 🏗️ 将客户端嵌入你自己的应用(Web、桌面、移动端)
  • • 🧩 同时连接多个MCP服务器,让AI拥有更多能力

现在就开始动手吧——你的第一个MCP聊天机器人,10分钟就能跑起来!


📢 关注"大强哥爱编程"公众号,获取更多AI技术前沿资讯!

🌟 喜欢这篇文章?请点赞、转发、收藏!有任何问题或建议,欢迎在评论区留言交流!

#大强哥爱编程 #MCP #AI开发教程 

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-16 23:03:16 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/754636.html
  2. 运行时间 : 0.104934s [ 吞吐率:9.53req/s ] 内存消耗:4,985.18kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=1d959505f632050c232384463124394e
  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.000666s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000923s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000359s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000336s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000546s ]
  6. SELECT * FROM `set` [ RunTime:0.000223s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000604s ]
  8. SELECT * FROM `article` WHERE `id` = 754636 LIMIT 1 [ RunTime:0.000502s ]
  9. UPDATE `article` SET `lasttime` = 1781622196 WHERE `id` = 754636 [ RunTime:0.008877s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000249s ]
  11. SELECT * FROM `article` WHERE `id` < 754636 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000474s ]
  12. SELECT * FROM `article` WHERE `id` > 754636 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000344s ]
  13. SELECT * FROM `article` WHERE `id` < 754636 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000726s ]
  14. SELECT * FROM `article` WHERE `id` < 754636 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.007682s ]
  15. SELECT * FROM `article` WHERE `id` < 754636 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.003950s ]
0.106609s