当前位置:首页>python>Python contextlib:优雅管理上下文资源的利器

Python contextlib:优雅管理上下文资源的利器

  • 2026-03-26 09:15:46
Python contextlib:优雅管理上下文资源的利器

深入浅出 Python contextlib:优雅管理上下文资源的利器

1. 引言:contextlib 的作用与意义

在 Python 编程中,资源管理是一个永恒的话题——无论是文件操作、数据库连接、锁的获取与释放,还是临时环境变量的设置与还原,我们都希望确保资源在使用后被正确清理。Python 的 with 语句配合上下文管理器(Context Manager)为我们提供了一种优雅的解决方案,但实现一个完整的上下文管理器往往需要编写一个包含 __enter__ 和 __exit__ 方法的类,代码略显冗长。

contextlib 模块正是为此而生。它提供了一系列工具,让我们能够以更简洁、更 Pythonic 的方式创建和使用上下文管理器。无论是简化现有资源的管理,还是快速创建自定义的上下文管理器,contextlib 都能让代码更清晰、更易维护。

本文将系统介绍 contextlib 的核心功能,通过实际案例展示每种用法的场景和技巧,帮助你在日常开发中灵活运用这些工具。


2. contextlib 核心功能与使用案例

2.1 @contextmanager 装饰器:用生成器快速创建上下文管理器

@contextmanager 是 contextlib 中最常用的工具。它允许我们通过一个生成器函数来定义上下文管理器,在 yield 之前的代码充当 __enter__ 的角色,yield 之后的代码充当 __exit__ 的角色。

案例:计时器上下文

import time
from contextlib import contextmanager

@contextmanager
deftimer(name: str):
"""统计代码块执行时间的上下文管理器"""
    start = time.time()
    print(f"[{name}] 开始执行...")
try:
yield# 将控制权交还给 with 代码块
finally:
        elapsed = time.time() - start
        print(f"[{name}] 执行完成,耗时: {elapsed:.4f} 秒")

# 使用示例
with timer("数据处理"):
# 模拟耗时操作
    time.sleep(1.2)
    sum(range(1000000))

代码解释

  • @contextmanager 将生成器函数 timer 转换为上下文管理器
  • yield 之前的代码(记录开始时间)在进入 with 块时执行
  • yield 之后的代码(计算耗时)在退出 with 块时执行
  • 使用 try...finally 确保即使 with 块内发生异常,也能正确输出耗时信息

输出

[数据处理] 开始执行...
[数据处理] 执行完成,耗时: 1.2012 秒

2.2 closing:确保对象被正确关闭

closing 用于管理那些提供了 close() 方法但没有实现上下文管理器协议的对象。它确保在退出 with 块时自动调用 close() 方法。

案例:管理自定义网络连接

from contextlib import closing

classNetworkConnection:
def__init__(self, host):
        self.host = host
        print(f"连接到 {host}")

defsend(self, data):
        print(f"发送数据: {data}")

defclose(self):
        print(f"关闭连接 {self.host}")

# 不使用 closing 时需要手动关闭
conn = NetworkConnection("localhost")
try:
    conn.send("hello")
finally:
    conn.close()

# 使用 closing 更优雅
with closing(NetworkConnection("localhost")) as conn:
    conn.send("hello")
# 退出 with 块时自动调用 conn.close()

代码解释

  • closing 接受一个对象,返回一个上下文管理器
  • 当 with 块退出时(无论正常还是异常),会自动调用该对象的 close() 方法
  • 特别适合管理数据库连接、网络套接字、文件流等资源

2.3 redirect_stdout 与 redirect_stderr:临时重定向输出

这两个工具允许你在 with 块内临时重定向标准输出或标准错误,非常适合测试、日志收集或屏蔽第三方库的打印信息。

案例:捕获 print 输出到文件或变量

import sys
from contextlib import redirect_stdout, redirect_stderr
import io

# 案例1:将输出重定向到文件
with open('output.log''w'as f:
with redirect_stdout(f):
        print("这条信息会写入文件,而不是控制台")
        print("另一条日志信息")

# 案例2:将输出捕获到字符串变量
f = io.StringIO()
with redirect_stdout(f):
    print("被捕获的内容")
    print("另一行内容")

captured = f.getvalue()
print(f"捕获到的内容: {captured}")

# 案例3:同时重定向 stdout 和 stderr
with redirect_stdout(io.StringIO()) as out, redirect_stderr(io.StringIO()) as err:
    print("标准输出")
    print("标准错误", file=sys.stderr)

print("stdout 内容:", out.getvalue())
print("stderr 内容:", err.getvalue())

代码解释

  • redirect_stdout 和 redirect_stderr 临时替换 sys.stdout 和 sys.stderr
  • 退出 with 块后自动恢复原始输出流
  • io.StringIO 可以作为内存中的文件对象,用于捕获输出内容
  • 支持嵌套使用,同时重定向多个流

2.4 ExitStack:动态管理多个上下文管理器

ExitStack 是 contextlib 中最强大的工具之一。它允许你动态地添加、弹出和清理上下文管理器,特别适合在循环中创建资源、条件性地添加上下文、或管理数量不确定的资源。

案例1:批量打开多个文件

from contextlib import ExitStack

filenames = ['file1.txt''file2.txt''file3.txt']

with ExitStack() as stack:
    files = []
for filename in filenames:
# 动态添加文件到栈中,退出时自动关闭所有文件
        f = stack.enter_context(open(filename, 'w'))
        files.append(f)

# 使用所有打开的文件
for i, f in enumerate(files):
        f.write(f"这是文件 {i+1} 的内容")

# 退出 with 块时,所有文件会以相反的顺序自动关闭

案例2:条件性添加资源管理

from contextlib import ExitStack, redirect_stdout
import sys

defprocess_data(debug=False, log_file=None):
with ExitStack() as stack:
# 如果提供了日志文件,则重定向 stdout
if log_file:
            f = stack.enter_context(open(log_file, 'w'))
            stack.enter_context(redirect_stdout(f))

# 如果需要调试输出,添加调试上下文
if debug:
# 假设有一个 DebugContext 类
            stack.enter_context(DebugContext())

# 核心业务逻辑
        print("处理数据中...")
# 更多处理逻辑...

classDebugContext:
def__enter__(self):
        print("调试模式开启")
return self

def__exit__(self, *args):
        print("调试模式关闭")

代码解释

  • stack.enter_context(obj) 将任意上下文管理器推入栈中
  • 退出 ExitStack 时,所有添加的资源会以 LIFO(后进先出) 顺序自动清理
  • 非常适合动态数量的资源、条件性添加资源、或需要复杂清理顺序的场景

2.5 nullcontext:占位上下文管理器

nullcontext 返回一个什么也不做的上下文管理器,可以作为条件性上下文的占位符,避免重复代码。

案例:可选的文件操作

from contextlib import nullcontext
import os

defprocess_file(filepath=None):
"""如果提供了 filepath 则打开文件,否则使用标准输出"""
# 如果 filepath 存在则打开文件,否则使用 nullcontext
if filepath:
        ctx = open(filepath, 'w')
else:
        ctx = nullcontext(sys.stdout)

with ctx as output:
        output.write("写入内容")
        print(f"输出到: {output}")

process_file()                      # 输出到标准输出
process_file("output.txt")          # 输出到文件

代码解释

  • nullcontext 接受一个可选的 enter_result 参数,作为 __enter__ 的返回值
  • 当条件不满足时,nullcontext 提供统一的接口,避免编写两套 with 逻辑
  • 特别适合函数参数可选、功能可选开关等场景

2.6 suppress:临时抑制异常

suppress 可以临时忽略指定的异常类型,让代码更简洁,避免空的 try...except 块。

案例:忽略特定的异常

from contextlib import suppress
import os

# 传统写法
try:
    os.remove('temp_file.txt')
except FileNotFoundError:
pass# 文件不存在时忽略

# 使用 suppress 更优雅
with suppress(FileNotFoundError):
    os.remove('temp_file.txt')

# 可以抑制多种异常
with suppress(FileNotFoundError, PermissionError):
# 尝试删除文件,忽略可能出现的文件不存在或权限错误
    os.remove('protected_file.txt')
    print("文件已删除")

代码解释

  • suppress 接受一个或多个异常类型
  • 在 with 块中发生的指定异常会被捕获并忽略
  • 其他异常会正常传播
  • 使代码意图更清晰:明确表示“这些异常是我预期可能发生的,可以安全忽略”

3. 综合案例:构建健壮的数据库连接管理

下面通过一个综合案例,展示如何组合使用 contextlib 的多个功能来构建一个优雅的数据库连接管理器。

from contextlib import contextmanager, ExitStack, suppress
import sqlite3
import logging

logging.basicConfig(level=logging.INFO)

classDatabase:
def__init__(self, db_path):
        self.db_path = db_path

    @contextmanager
defconnection(self):
"""管理数据库连接,自动提交或回滚"""
        conn = sqlite3.connect(self.db_path)
try:
yield conn
            conn.commit()
except Exception as e:
            conn.rollback()
            logging.error(f"事务回滚: {e}")
raise
finally:
            conn.close()

    @contextmanager
deftransaction(self):
"""事务上下文,支持嵌套事务(使用保存点)"""
with self.connection() as conn:
# 检查是否已在事务中,如果是则创建保存点
if conn.in_transaction:
                savepoint_name = f"sp_{id(conn)}_{len(conn._savepoints)}"
                conn.execute(f"SAVEPOINT {savepoint_name}")
try:
yield conn
                    conn.execute(f"RELEASE SAVEPOINT {savepoint_name}")
except Exception:
                    conn.execute(f"ROLLBACK TO SAVEPOINT {savepoint_name}")
raise
else:
# 新事务,使用自动提交/回滚
yield conn

defexecute_many(self, queries, fail_fast=False):
"""批量执行 SQL,可选择快速失败或全部尝试"""
with ExitStack() as stack:
# 如果没有 fail_fast,则抑制异常继续执行
ifnot fail_fast:
# 使用 suppress 忽略异常
                stack.enter_context(suppress(Exception))

with self.connection() as conn:
for sql, params in queries:
with suppress(Exception) ifnot fail_fast else nullcontext():
                        conn.execute(sql, params)

# 使用示例
db = Database(":memory:")  # 使用内存数据库

# 创建表
with db.connection() as conn:
    conn.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)")

# 使用事务插入数据
with db.transaction() as conn:
    conn.execute("INSERT INTO users (name) VALUES (?)", ("Alice",))
    conn.execute("INSERT INTO users (name) VALUES (?)", ("Bob",))
# 如果这里发生异常,事务会自动回滚
# raise Exception("模拟异常")

# 批量执行,即使部分失败也继续
queries = [
    ("INSERT INTO users (name) VALUES (?)", ("Charlie",)),
    ("INSERT INTO users (name) VALUES (?)", (None,)),  # 会失败,name 不能为 NULL
    ("INSERT INTO users (name) VALUES (?)", ("David",)),
]
db.execute_many(queries, fail_fast=False)

# 查询结果
with db.connection() as conn:
    cursor = conn.execute("SELECT * FROM users")
    print("最终数据:", cursor.fetchall())

综合案例解释

  • **@contextmanager**:定义 connection 和 transaction 两个上下文管理器
  • **ExitStack**:在 execute_many 中动态管理多个上下文
  • **suppress**:在非快速失败模式下,忽略单个 SQL 执行错误
  • **nullcontext**:在快速失败模式下作为占位符,保持代码结构统一

4. 总结

contextlib 模块通过一系列简洁而强大的工具,极大地简化了 Python 中资源管理的工作。回顾本文介绍的核心功能:

功能
核心作用
典型场景
@contextmanager
用生成器快速创建自定义上下文管理器
计时器、资源锁定、状态切换
closing
确保对象被正确关闭
管理未实现上下文协议但有关闭方法的对象
redirect_stdout/stderr
临时重定向输出流
测试、日志收集、屏蔽第三方输出
ExitStack
动态管理多个上下文管理器
批量资源管理、条件性上下文、复杂清理顺序
nullcontext
占位上下文管理器
条件性可选资源、避免重复代码
suppress
临时抑制特定异常
优雅忽略预期异常、替代空 except 块

最佳实践建议

  1. 优先使用 @contextmanager 而非手动编写类,代码更简洁
  2. 当需要管理大量同类资源时,ExitStack 是最佳选择
  3. suppress 能显著提升代码可读性,但仅用于预期异常的忽略
  4. 组合使用多个工具可以构建更强大的资源管理组件

掌握 contextlib,你就能写出更 Pythonic、更健壮、更易维护的代码。下次当你需要管理文件、数据库连接、锁或其他资源时,不妨想想 contextlib 能否让代码更优雅。


希望本文对你理解和使用 Python contextlib 有所帮助。欢迎在评论区分享你的使用经验或疑问!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 09:58:35 HTTP/2.0 GET : https://f.mffb.com.cn/a/482735.html
  2. 运行时间 : 0.117085s [ 吞吐率:8.54req/s ] 内存消耗:4,863.69kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=8f7136359e62a4afca96a74a87dc6dbb
  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.000576s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000817s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000334s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000245s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000480s ]
  6. SELECT * FROM `set` [ RunTime:0.000199s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000476s ]
  8. SELECT * FROM `article` WHERE `id` = 482735 LIMIT 1 [ RunTime:0.001613s ]
  9. UPDATE `article` SET `lasttime` = 1774576715 WHERE `id` = 482735 [ RunTime:0.010458s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.004642s ]
  11. SELECT * FROM `article` WHERE `id` < 482735 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000641s ]
  12. SELECT * FROM `article` WHERE `id` > 482735 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000514s ]
  13. SELECT * FROM `article` WHERE `id` < 482735 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004511s ]
  14. SELECT * FROM `article` WHERE `id` < 482735 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000860s ]
  15. SELECT * FROM `article` WHERE `id` < 482735 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001236s ]
0.118713s