当前位置:首页>python>【一起学 Python】第 72 天:Socket 错误处理与超时机制

【一起学 Python】第 72 天:Socket 错误处理与超时机制

  • 2026-07-03 14:24:01
【一起学 Python】第 72 天:Socket 错误处理与超时机制

欢迎来到 Python 学习计划的第 72 天!🎉

昨天我们学习了 异步 Socket 编程,掌握了高并发服务器的实现。但网络环境是不可靠的:连接可能超时、服务器可能宕机、数据包可能丢失。

今天我们将学习如何构建健壮的网络应用——Socket 错误处理与超时机制。这是区分"玩具代码"和"工程代码"的关键一步!

🎯 今日学习目标

    • 理解完整的 Socket 异常体系和继承关系
    • 学会正确的异常捕获和处理策略
    • 掌握同步和异步超时机制
    • 实现智能重连和重试策略
    • 学会日志记录和故障诊断
    • 编写健壮的生产级网络代码

    📚 Socket 异常体系详解

    异常继承关系

    完整的异常分类

    Python 中所有 Socket 异常都继承自 OSError

    异常类型

    说明

    继承关系

    OSError

    所有 Socket 异常的基类

    最顶层

    socket.error

    OSError 的别名(已弃用)

    = OSError

    socket.timeout

    TimeoutError 的别名

    继承自 OSError

    连接异常组

    ConnectionError

    连接相关异常的基类

    继承自 OSError

    ConnectionRefusedError

    连接被拒绝(ECONNREFUSED)

    继承自 ConnectionError

    ConnectionResetError

    连接被重置(ECONNRESET)

    继承自 ConnectionError

    ConnectionAbortedError

    连接被中止(ECONNABORTED)

    继承自 ConnectionError

    BrokenPipeError

    管道断裂(EPIPE)

    继承自 ConnectionError

    地址相关异常

    socket.herror

    地址相关错误(gethost*错误)

    继承自 OSError

    socket.gaierror

    getaddrinfo() 错误

    继承自 OSError

    权限异常

    PermissionError

    权限不足(EACCES)

    继承自 OSError

    异常捕获最佳实践

    import socketdef handle_socket_error(operation):    """异常捕获最佳实践"""    try:        # 执行操作        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)        sock.connect(('example.com'8888))    # 1. 首先捕获具体的、可恢复的异常    except socket.timeout:        print("⏱️ 超时异常 - 可以重试")    except ConnectionRefusedError:        print("❌ 连接被拒绝 - 可能需要检查服务器")    except socket.gaierror as e:        print(f"❌ 地址解析失败: {e} - 检查 DNS/主机名")    except socket.herror as e:        print(f"❌ 主机名错误: {e}")    except PermissionError:        print("❌ 权限不足 - 需要管理员权限")    # 2. 然后捕获宽泛的连接异常    except ConnectionError as e:        print(f"❌ 连接错误: {type(e).__name__}{e}")    # 3. 最后捕获通用的 OS 错误    except OSError as e:        print(f"❌ OS 错误 (errno={e.errno}): {e}")        # 常见 errno:        # 98/10048 - 地址已被使用 (EADDRINUSE)        # 111/10061 - 连接被拒绝 (ECONNREFUSED)    # 4. 最后用通用异常捕捉未预期的错误    except Exception as e:        print(f"❌ 未知异常: {type(e).__name__}{e}")    finally:        # 5. 一定要在 finally 中清理资源        if 'sock' in locals():            try:                sock.close()            except:                pass

    🔍 常见异常详解与处理

    1. 连接类异常

    ConnectionRefusedError - 连接被拒绝

    import sockettry:    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.connect(('127.0.0.1'8888))except ConnectionRefusedError:    print("❌ 连接被拒绝")    # 常见原因:    # 1. 服务器未启动    # 2. 端口号错误    # 3. 防火墙阻止    # 4. 绑定地址限制(如只监听 localhost)

    ConnectionResetError - 连接被重置

    try:    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.connect(('remote.server.com'8888))    sock.send(b"data")except ConnectionResetError:    print("❌ 连接被重置")    # 常见原因:    # 1. 对方强制关闭连接    # 2. 网络不稳定,中间节点重置    # 3. 防火墙处理超时连接    # 4. 对方主机故障

    BrokenPipeError - 管道断裂

    try:    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.connect(('127.0.0.1'8888))    # 对方关闭了连接    sock.send(b"data")  # 这里会抛异常except BrokenPipeError:    print("❌ 管道断裂")    # 常见原因:    # 1. 对方已关闭连接    # 2. 发送到已关闭的 Socket    # 解决方案:    # 1. 检查对方连接状态    # 2. 重新连接    # 3. 或停止发送数据

    2. 地址相关异常

    socket.gaierror - 地址解析失败

    import sockettry:    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 尝试连接到无效的主机名    sock.connect(('invalid-hostname-12345.com'8888))except socket.gaierror as e:    print(f"❌ getaddrinfo 错误: {e}")    # 常见原因:    # 1. 主机名不存在    # 2. DNS 查询失败    # 3. 网络不通    # 解决方案:    # 1. 检查主机名拼写    # 2. 检查 DNS 设置    # 3. 尝试使用 IP 地址

    socket.herror - 主机名错误

    try:    # gethost* 函数的错误    socket.gethostbyname('invalid-hostname-12345.com')except socket.herror as e:    print(f"❌ 主机错误: {e}")

    3. 超时异常

    import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(5)try:    sock.connect(('slow.server.com'8888))except socket.timeout:    print("⏱️ 连接超时")    # 解决方案:    # 1. 增加超时时间    # 2. 检查网络连接    # 3. 考虑重试连接    # 4. 检查对方服务是否响应缓慢

    4. 权限和资源异常

    import socket# PermissionError - 权限不足try:    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.bind(('0.0.0.0'80))  # 需要 root 权限except PermissionError:    print("❌ 权限不足")    # 解决方案:    # 1. 使用 sudo 运行    # 2. 改用高于 1024 的端口    # 3. 配置系统权限# OSError - 文件描述符溢出try:    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.bind(('0.0.0.0'8888))except OSError as e:    if e.errno == 98 or e.errno == 10048:  # Linux / Windows        print("❌ 端口已被占用")    elif "too many open files" in str(e):        print("❌ 文件描述符溢出")    else:        print(f"❌ OS 错误: {e}")

    5. 数据处理异常

    # UnicodeDecodeError - 解码错误data = b'\xff\xfe\x00'try:    message = data.decode('utf-8')except UnicodeDecodeError:    print("❌ 解码错误 - 数据格式不匹配")    # 解决方案:    message = data.decode('utf-8', errors='replace')  # 用 ? 替换    print(f"容错后: {message}")  # 输出:???

    ⏱️ 超时机制详解

    异常处理流程

    同步 Socket 超时

    方法 1:单个 Socket 超时

    import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置超时时间(秒)sock.settimeout(5.0)# 获取当前超时设置timeout = sock.gettimeout()print(f"当前超时: {timeout}秒")# 修改超时sock.settimeout(10.0)# 设置为阻塞模式(无超时)sock.settimeout(None)  # 或 sock.setblocking(True)# 设置为非阻塞模式sock.settimeout(0)  # 或 sock.setblocking(False)# 非阻塞 Socket 操作时会立即返回,如果操作未就绪则抛异常try:    sock.connect(('127.0.0.1'8888))except BlockingIOError:    print("⏱️ 操作未完成,Socket 是非阻塞模式")

    方法 2:全局默认超时

    import socket# 为所有新创建的 Socket 设置默认超时socket.setdefaulttimeout(10.0)# 获取默认超时default_timeout = socket.getdefaulttimeout()print(f"默认超时: {default_timeout}秒")# 新创建的 Socket 会使用默认超时sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)print(f"Socket 超时: {sock1.gettimeout()}")  # 10.0# 可以为单个 Socket 覆盖默认超时sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock2.settimeout(5.0)  # 使用 5 秒而不是默认的 10 秒

    方法 3:按操作设置不同超时

    import socketdef connect_and_recv(host, port):    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    # 连接超时:5 秒    sock.settimeout(5)    try:        sock.connect((host, port))        print("✅ 连接成功")    except socket.timeout:        print("⏱️ 连接超时")        return None    # 接收超时:30 秒(比连接超时长)    sock.settimeout(30)    try:        data = sock.recv(1024)        return data    except socket.timeout:        print("⏱️ 接收超时")        return None    finally:        sock.close()

    Socket 三种模式对比

    模式

    设置方法

    超时设置

    行为

    使用场景

    阻塞

    setblocking(True)

    settimeout(None)

    操作阻塞直到完成或超时

    大多数情况

    非阻塞

    setblocking(False)

    settimeout(0)

    操作立即返回,未就绪则抛 BlockingIOError

    select/poll 配合使用

    超时

    setblocking(True)

    settimeout(n)

    操作阻塞最多 n 秒,超时则抛 socket.timeout

    import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 方式 1:设置为阻塞模式sock.setblocking(True)# 等价于:# sock.settimeout(None)# 方式 2:设置为非阻塞模式sock.setblocking(False)# 等价于:# sock.settimeout(0)# 方式 3:设置超时sock.settimeout(5.0)

    异步 Socket 超时

    import asyncioasync def async_timeout_examples():    """异步超时示例"""    # 方式 1:wait_for 包装协程    try:        reader, writer = await asyncio.wait_for(            asyncio.open_connection('127.0.0.1'8888),            timeout=5.0        )        print("✅ 连接成功")    except asyncio.TimeoutError:        print("⏱️ 连接超时")    except ConnectionRefusedError:        print("❌ 连接被拒绝")    # 方式 2:单独超时读操作    try:        data = await asyncio.wait_for(            reader.read(1024),            timeout=10.0        )    except asyncio.TimeoutError:        print("⏱️ 读取超时")    # 方式 3:单独超时写操作    try:        writer.write(b"data")        await asyncio.wait_for(            writer.drain(),            timeout=10.0        )    except asyncio.TimeoutError:        print("⏱️ 写入超时")asyncio.run(async_timeout_examples())

    🔄 重连和重试策略

    重试策略对比

    📝 生产级示例

    健壮的客户端

    import socketimport timeclass SimpleClient:    def __init__(self, host, port, timeout=5):        self.host = host        self.port = port        self.timeout = timeout        self.sock = None    def connect(self, retries=3):        for i in range(retries):            try:                self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                self.sock.settimeout(self.timeout)                self.sock.connect((self.host, self.port))                print("✅ 连接成功")                return True            except Exception as e:                print(f"❌ 连接失败: {e}")                if self.sock:                    self.sock.close()                if i < retries - 1:                    time.sleep(2 ** i)        return False    def send(self, data):        try:            msg = data.encode() if isinstance(data, strelse data            self.sock.sendall(msg)            return True        except Exception as e:            print(f"❌ 发送失败: {e}")            return False    def recv(self, bufsize=1024):        try:            data = self.sock.recv(bufsize)            return data.decode() if data else None        except Exception as e:            print(f"❌ 接收失败: {e}")            return None    def close(self):        if self.sock:            self.sock.close()# 使用client = SimpleClient('127.0.0.1'8888)if client.connect():    client.send("Hello")    response = client.recv()    print(f"收到: {response}")    client.close()

    健壮的服务器

    import socketimport threadingclass SimpleServer:    def __init__(self, host='0.0.0.0', port=8888):        self.host = host        self.port = port        self.server = None    def start(self):        try:            self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)            self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)            self.server.bind((self.host, self.port))            self.server.listen(5)            print(f"✅ 服务器启动: {self.host}:{self.port}")            while True:                try:                    client, addr = self.server.accept()                    print(f"✅ 连接: {addr}")                    thread = threading.Thread(                        target=self.handle_client,                        args=(client, addr)                    )                    thread.daemon = True                    thread.start()                except KeyboardInterrupt:                    break                except Exception as e:                    print(f"❌ 错误: {e}")        finally:            self.stop()    def handle_client(self, client, addr):        client.settimeout(30)        try:            while True:                data = client.recv(1024)                if not data:                    break                print(f"📨 收到: {data.decode()}")                client.sendall(data)  # Echo        except Exception as e:            print(f"❌ 客户端 {addr} 错误: {e}")        finally:            client.close()    def stop(self):        if self.server:            self.server.close()            print("✅ 服务器已停止")# 使用server = SimpleServer()try:    server.start()except KeyboardInterrupt:    print("👋 关闭服务器")

    📋 注意事项清单

    ┌─────────────────────────────────────────────────────────┐│          健壮网络编程注意事项                            │├─────────────────────────────────────────────────────────┤│                                                           ││  ✓ 始终设置超时时间(settimeout / wait_for)             ││  ✓ 实现重试机制(指数退避)                              ││  ✓ 捕获特定异常(ConnectionRefusedError 等)             ││  ✓ 使用异常链保留原始错误(raise ... from ...)          ││  ✓ 确保资源关闭(finally / with / async with)           ││  ✓ 记录详细日志(traceback / __cause__)                 ││  ✓ 处理连接断开(BrokenPipeError / ConnectionReset)     ││                                                           │└─────────────────────────────────────────────────────────┘

    🎉 模块学习路线

    ┌─────────────────────────────────────────────────────────┐│          Socket 编程基础模块(第 70-73 天)               │├─────────────────────────────────────────────────────────┤│                                                           ││  第 70 天 ✓  Socket API 基础:创建 TCP 与 UDP 连接        ││       │    • Socket 概念与原理                           ││       │    • TCP vs UDP 对比                             ││       │                                                  ││       ▼                                                  ││  第 71 天 ✓  Python 3.14 中的异步 Socket 编程             ││       │    • asyncio 与 Socket 结合                      ││       │    • 高并发服务器实现                            ││       │                                                  ││       ▼                                                  ││  第 72 天 ✓  Socket 错误处理与超时机制                    ││       │    • 网络异常处理                                ││       │    • 超时设置与重试                              ││       │    • 异常链与日志                                ││       │                                                  ││       ▼                                                  ││  第 73 天   基于 Socket 的简单聊天应用实现               ││            • 综合实战项目                                ││            • 多客户端聊天室                              ││                                                           │└─────────────────────────────────────────────────────────┘

    📌 明日预告:基于 Socket 的简单聊天应用实现

    明天我们将进入 Socket 编程模块最后一天,进行综合实战!

    • 主题:基于 Socket 的简单聊天应用实现
    • 核心问题
      1. 如何构建多客户端聊天服务器?
      2. 如何实现消息广播机制?
      3. 如何处理客户端断开和重连?
      4. 如何设计简单的通信协议?
      5. 如何结合今天的错误处理机制?

    💡 提前思考

    1. 服务器如何知道哪个客户端发送了消息?
    2. 如果客户端突然断开,服务器如何清理资源?
    3. 如何防止恶意客户端发送大量数据?

    最新文章

    随机文章

    基本 文件 流程 错误 SQL 调试
    1. 请求信息 : 2026-07-04 16:57:26 HTTP/2.0 GET : https://f.mffb.com.cn/a/488820.html
    2. 运行时间 : 0.169486s [ 吞吐率:5.90req/s ] 内存消耗:4,788.88kb 文件加载:140
    3. 缓存信息 : 0 reads,0 writes
    4. 会话信息 : SESSION_ID=43435ccc3ee5023d092ebcd51153893d
    1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
    2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
    3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
    4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
    5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
    6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
    7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
    8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
    9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
    10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
    11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
    12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
    13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
    14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
    15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
    16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
    17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
    18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
    19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
    20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
    21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
    22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
    23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
    24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
    25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
    26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
    27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
    28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
    29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
    30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
    31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
    32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
    33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
    34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
    35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
    36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
    37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
    38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
    39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
    40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
    41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
    42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
    43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
    44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
    45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
    46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
    47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
    48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
    49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
    50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
    51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
    52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
    53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
    54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
    55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
    56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
    57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
    58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
    59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
    60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
    61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
    62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
    63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
    64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
    65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
    66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
    67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
    68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
    69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
    70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
    71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
    72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
    73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
    74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
    75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
    76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
    77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
    78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
    79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
    80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
    81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
    82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
    83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
    84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
    85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
    86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
    87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
    88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
    89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
    90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
    91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
    92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
    93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
    94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
    95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
    96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
    97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
    98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
    99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
    100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
    101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
    102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
    103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
    104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
    105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
    106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
    107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
    108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
    109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
    110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
    111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
    112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
    113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
    114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
    115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
    116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
    117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
    118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
    119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
    120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
    121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
    122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
    123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
    124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
    125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
    126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
    127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
    128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
    129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
    130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
    131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
    132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
    133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
    134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
    135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
    136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
    137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
    138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
    139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
    140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
    1. CONNECT:[ UseTime:0.000816s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
    2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000560s ]
    3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002608s ]
    4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.001648s ]
    5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000465s ]
    6. SELECT * FROM `set` [ RunTime:0.000196s ]
    7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000611s ]
    8. SELECT * FROM `article` WHERE `id` = 488820 LIMIT 1 [ RunTime:0.000461s ]
    9. UPDATE `article` SET `lasttime` = 1783155446 WHERE `id` = 488820 [ RunTime:0.003486s ]
    10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000221s ]
    11. SELECT * FROM `article` WHERE `id` < 488820 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000519s ]
    12. SELECT * FROM `article` WHERE `id` > 488820 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000378s ]
    13. SELECT * FROM `article` WHERE `id` < 488820 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001025s ]
    14. SELECT * FROM `article` WHERE `id` < 488820 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001182s ]
    15. SELECT * FROM `article` WHERE `id` < 488820 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.003019s ]
    0.173370s