乐于分享
好东西不私藏

Pytest Fixture源码深度解析:从装饰器到依赖注入的魔法

Pytest Fixture源码深度解析:从装饰器到依赖注入的魔法

在上一篇文章中,我们剖析了 pytest 的整体架构和 pluggy 插件系统。今天,我们把目光聚焦在 pytest 最核心、最强大的功能之一——fixture 上。

你一定写过这样的代码:

import pytest@pytest.fixturedef api_client():    client = requests.Session()    yield client    client.close()def test_get_user(api_client):    response = api_client.get("/users/1")    assert response.status_code == 200

这个 @pytest.fixture 装饰器背后发生了什么?pytest 是如何发现你的 fixture 函数、解析依赖关系、按正确顺序调用的?为什么 yield 之后的代码能保证在测试结束后执行?

本文将深入 pytest 源码,一步步揭开 fixture 机制的神秘面纱。

一、Fixture 的核心概念回顾

在深入源码之前,先明确 fixture 的几个核心特性(也是我们将在源码中追踪的关键点):

特性说明
依赖注入测试函数通过参数名声明需要的 fixture,pytest 自动查找并提供
作用域functionclassmodulepackagesession,控制生命周期
自动清理使用 yield 实现 teardown,无论测试成功或失败都会执行
依赖解析fixture 可以依赖其他 fixture,pytest 自动构建调用图并按拓扑顺序执行
缓存机制同一作用域内,fixture 的返回值会被缓存,多次请求不会重复执行
工厂模式通过 params 参数实现参数化 fixture,每个参数值生成一个独立实例

下面我们从 @pytest.fixture 装饰器的源码入口开始。

二、装饰器的魔法:@pytest.fixture 做了什么

2.1 入口:fixture 装饰器

源码位置:_pytest/fixtures.py

def fixture(    fixture_function: Optional[Callable] = None,    *,    scope: Union[_Scope, Callable[[str, Config], _Scope]] = "function",    params: Optional[Iterable[object]] = None,    autouse: bool = False,    ids: Optional[        Union[Iterable[Union[strfloatintboolNone]], Callable[[Any], Optional[object]]]    ] = None,    name: Optional[str] = None,) -> Union[Callable, FixtureFunctionMarker]:

当我们在代码中写 @pytest.fixture 时,实际上是在调用这个函数。它返回一个 FixtureFunctionMarker 对象,这个对象的 __call__ 方法会被装饰器调用,从而对原函数进行“标记”。

2.2 FixtureFunctionMarker 的核心作用

FixtureFunctionMarker 是一个标记类,它不会修改原函数的行为,而是为函数附加元数据——这些元数据存储在 func._pytestfixturefunction 属性中,包含了作用域、autouse、params 等信息。

# 简化版逻辑class FixtureFunctionMarker:    def __init__(self, scope, params, autouse, name):        self.scope = scope        self.params = params        self.autouse = autouse        self.name = name    def __call__(self, function):        # 将 fixture 元数据附加到函数对象上        function._pytestfixturefunction = self        return function

这样,当 pytest 在收集阶段扫描模块时,就能通过检查 hasattr(obj, "_pytestfixturefunction") 来识别哪些函数是 fixture。

💡 这种“通过附加属性来标记”的设计在 pytest 中非常普遍,也是 Python 装饰器的一种经典用法——不改变函数行为,只添加元信息。

三、Fixture 的收集:pytest 如何发现 fixture

3.1 收集入口:pytest_collection 阶段

在测试收集阶段,pytest 会遍历每个测试模块,对于模块中定义的每个函数,调用 _pytest.python.pycollector 来判断它是普通测试函数还是 fixture。

关键代码位于 _pytest/python.py 中的 PyCollector 和 pytest_pycollect_makemodule 钩子。

3.2 Fixture 注册到 session._fixturemanager

所有收集到的 fixture 会被注册到 session._fixturemanager(一个 FixtureManager 实例)。FixtureManager 是整个 fixture 系统的中央注册表,它负责:

存储所有已知 fixture 的定义(函数、作用域、参数等)

解析 fixture 之间的依赖关系

按作用域缓存 fixture 的实例

# 简化版 FixtureManager 核心结构class FixtureManager:    def __init__(self, session):        self.session = session        self._arg2fixturedefs = {}  # 参数名 -> FixtureDef 列表        self._fixturedefs = []      # 所有 FixtureDef 对象        self._matchings = {}         # 缓存节点与 fixture 的匹配关系

每个 fixture 会被包装成一个 FixtureDef 对象,它包含了执行 fixture 所需的所有信息:函数引用、作用域、参数、依赖的 fixture 名称列表等。

3.3 autouse fixture 的特殊处理

autouse=True 的 fixture 会被特殊标记。在收集阶段结束时,FixtureManager 会扫描所有 autouse fixture,并将它们自动添加到每个匹配的测试节点上。这就是为什么 autouse fixture 无需在测试参数中声明也能生效。

四、依赖解析:pytest 如何知道先调谁

当测试函数有多个 fixture 参数时,pytest 需要按正确顺序调用这些 fixture。更重要的是,fixture 本身可能依赖其他 fixture,这就形成了一个有向无环图(DAG)。

4.1 依赖图的构建

FixtureDef 对象在初始化时会解析其依赖:

class FixtureDef:    def __init__(self, func, scope, params, ...):        self.func = func        self.scope = scope        # 解析函数参数,这些参数名就是依赖的 fixture 名称        self.argnames = getfixturenames(func, self)

getfixturenames 会检查函数的签名(inspect.signature),提取所有参数名,过滤掉非 fixture 的参数(如 self、cls),剩下的就是依赖的 fixture 名称。

4.2 拓扑排序:确定执行顺序

当 pytest 需要为一个测试函数准备所有依赖时,会调用 FixtureManager.getfixturedefs 递归地获取每个依赖的 FixtureDef,然后通过 _compute_fixture_deps 进行拓扑排序。

核心逻辑伪代码:

def _compute_fixture_deps(fixturedef, fixturemanager, seen):    # 深度优先遍历依赖图    for argname in fixturedef.argnames:        dep_fixturedef = fixturemanager.getfixturedefs(argname, ...)[-1]        if dep_fixturedef not in seen:            _compute_fixture_deps(dep_fixturedef, fixturemanager, seen)    seen.append(fixturedef)    return seen  # 按依赖顺序返回

这个递归函数确保了:被依赖的 fixture 会先执行,依赖方后执行。

4.3 循环依赖检测

如果出现了 A 依赖 B、B 依赖 A 的情况,pytest 会在依赖解析阶段抛出异常:

pytest.fixtures.FixtureLookupError:     RecursionError: A fixture named 'a' tried to use itself recursively.

源码中通过一个 _active_fixture_stack 来检测循环:每次进入一个 fixture 的求值前,会检查它是否已经在当前调用栈中。

五、请求上下文:request 对象和 FixtureRequest

细心的你一定注意到,fixture 函数可以接受一个特殊的 request 参数:

@pytest.fixturedef user_id(request):    return request.param   # 用于参数化 fixture

这个 request 对象是 FixtureRequest 的实例,它封装了当前请求的上下文信息,包括:

属性/方法说明
request.param参数化 fixture 的当前参数值
request.node当前测试节点 (Item)
request.configpytest 配置对象
request.module当前测试模块
request.cls当前测试类(如果存在)
request.getfixturevalue(name)动态获取其他 fixture 的值

FixtureRequest 对象在 pytest 准备执行一个测试节点时创建,并传递给该节点所需的所有 fixture。

5.1 getfixturevalue 的内部实现

这个方法是动态获取 fixture 的关键。它的执行流程:

通过 _get_active_fixturedef 找到对应参数的 FixtureDef

调用 FixtureDef.execute(request) 获取或创建 fixture 实例

返回实例值

这意味着你可以在 fixture 中根据运行时条件来决定获取哪些其他 fixture——非常灵活。

六、作用域管理与缓存机制

6.1 作用域的定义

pytest 内置五种作用域:function、class、module、package、session。

FixtureDef 中存储了作用域信息,并在创建实例时,会从 FixtureManager 获取一个作用域缓存字典:

def _get_scope_cache(self, request):    scope = self._get_scope(request)    if scope == "function":        return request._func_request._fixture_cache  # 每个测试函数独立    elif scope == "class":        return request.cls._pytest_fixture_cache  # 每个测试类共享    elif scope == "module":        return request.module._pytest_fixture_cache  # 每个模块共享    elif scope == "session":        return request.session._sessioncache  # 整个会话共享

6.2 缓存的键与命中逻辑

缓存字典的键是 (fixturedef, params_tuple),其中 params_tuple 用于区分参数化 fixture 的不同参数值。当同一个 fixture 在同一作用域被多次请求时,只需从缓存中取出已创建的值,不会重复执行 fixture 函数。

这个机制极大地提升了性能:比如 scope="session" 的数据库连接 fixture,只会被创建一次,所有测试共享同一个连接。

6.3 yield fixture 的缓存特殊处理

对于使用 yield 的 fixture,pytest 在第一次请求时会执行到 yield 处,将 yield 后的代码暂存起来,然后返回值。当作用域结束时(比如 function 作用域的 fixture 在测试函数执行完毕后),pytest 会调用缓存中保存的 teardown 代码。

这个 teardown 的调用时机由 FixtureDef.finish() 方法控制,它会在节点的 teardown 阶段被执行。

七、参数化 fixture:@pytest.fixture(params=...)

当你这样写时:

@pytest.fixture(params=["chrome""firefox""safari"])def browser(request):    return request.param

pytest 会为每个参数值生成一个独立的 fixture 实例。在源码层面,这通过 FixtureDef.cached_result 存储为一个列表,每个参数值对应一个缓存条目。

参数化 fixture 和测试函数的参数化可以叠加使用,pytest 会自动处理它们的笛卡尔积。

八、完整执行链路图

让我们用一张图总结 fixture 从收集到执行的全过程:

1. 测试文件被加载   │   ▼2. 扫描模块中的函数,识别 @pytest.fixture 装饰器   │   -> 创建 FixtureFunctionMarker 附加元数据   │   -> 注册到 FixtureManager (创建 FixtureDef)   │   ▼3. 收集测试函数,解析其参数列表   │   -> 参数名 -> 去 FixtureManager 查找对应的 FixtureDef   │   -> 递归解析依赖,构建依赖图(拓扑排序)   │   ▼4. 执行测试(调用 pytest_runtest_call)   │   ├─ 为每个需要的 fixture 调用 FixtureDef.execute()   │   ├─ 检查作用域缓存,命中则直接返回   │   ├─ 未命中则递归执行依赖的 fixture(先执行依赖)   │   ├─ 调用 fixture 函数(传入 request)   │   └─ 缓存结果(如果使用 yield,注册 teardown 回调)   │   └─ 执行测试函数主体   │   ▼5. 测试完成后,调用注册的 teardown 回调(yield 后的代码)

关键数据结构一览

职责
FixtureManager全局注册表,管理所有 fixture 定义,提供依赖解析
FixtureDef单个 fixture 的定义,包含函数、作用域、参数、依赖列表、缓存
FixtureRequest请求上下文,封装了当前测试节点信息,提供动态获取 fixture 的能力
_FixtureCaching作用域级别的缓存存储,位于 request/session/module/class 上

九、实战:调试 fixture 源码

如果你想在源码中调试 fixture 的执行过程,可以在以下位置设置断点:

  • _pytest/fixtures.py:FixtureDef.execute —— fixture 实际执行的地方

  • _pytest/fixtures.py:FixtureManager.getfixturedefs —— 获取 fixture 定义

  • _pytest/python.py:Function._requestfixture —— 测试函数请求 fixture 的入口

建议使用 pytest --trace 或在代码中插入 breakpoint() 结合 pdb 单步跟踪。

十、总结与延伸思考

通过源码分析,我们揭示了 pytest fixture 背后的一系列精妙设计:

  • 标记而非修改:@pytest.fixture 只是添加元数据,不改变原函数行为

  • 集中注册:FixtureManager 作为中央注册表,管理所有 fixture 定义

  • 依赖图 + 拓扑排序:自动解析依赖关系,按正确顺序执行

  • 作用域缓存:不同粒度的缓存机制,提升性能

  • 请求对象:封装上下文,支持动态获取和参数化

  • yield 语法:利用生成器实现 teardown,优雅且可靠‍

 每一次互动,皆是鼓励, 每一份支持,共促成长。

商务合作:RYXtest

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-31 17:30:50 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/688853.html
  2. 运行时间 : 0.092021s [ 吞吐率:10.87req/s ] 内存消耗:4,720.27kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5ec3fb5561633a13a1ee75e674074a2e
  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.000743s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001055s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000382s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000334s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000580s ]
  6. SELECT * FROM `set` [ RunTime:0.000220s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000673s ]
  8. SELECT * FROM `article` WHERE `id` = 688853 LIMIT 1 [ RunTime:0.000698s ]
  9. UPDATE `article` SET `lasttime` = 1780219850 WHERE `id` = 688853 [ RunTime:0.001840s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000262s ]
  11. SELECT * FROM `article` WHERE `id` < 688853 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000451s ]
  12. SELECT * FROM `article` WHERE `id` > 688853 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000632s ]
  13. SELECT * FROM `article` WHERE `id` < 688853 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000700s ]
  14. SELECT * FROM `article` WHERE `id` < 688853 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000817s ]
  15. SELECT * FROM `article` WHERE `id` < 688853 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002432s ]
0.093800s