当前位置:首页>Linux>Linux 内核 folio 机制分析

Linux 内核 folio 机制分析

  • 2026-06-29 17:09:39
Linux 内核 folio 机制分析

Linux 内核 folio 机制分析:从 struct page 到统一内存抽象

1. 背景

Linux 内核长期以来使用 struct page 作为物理内存的基本描述单元。每个物理页对应一个 struct page 实例,内核通过它管理页面状态、引用计数、LRU 链表等。

但随着 Transparent Huge Page(THP)、hugetlbfs、compound page 等机制的引入,struct page 的局限性越来越明显:

  • 单一页与多页(compound)的处理逻辑大量重复:同一个函数需要判断 PageHead() / PageTail() 分别处理

  • head/tail 指针混用容易出错compound_head() 的频繁调用增加了代码复杂度和运行时开销

  • flag 位冲突struct page 的 flags 字段在 head page 和 tail page 中有不同的含义,容易误用

  • API 不统一:某些函数接受 struct page *,某些需要 struct page *head,调用方容易传错

这些问题在 Matthew Wilcox 的 folio 提案 中被系统性地指出。从 Linux 5.15 开始,内核引入 struct folio 作为新的内存管理抽象层,目标是统一单页和多页的处理路径。

信息来源:wiki/concepts/memory-management.md(内核版本 6.12.17),本文源码分析基于 Linux 7.0。

2. Folio 定义

Folio 不是一个独立的内存分配单元,而是对 struct page 的封装和统一。每个 folio 包含一个或多个连续的物理页。

2.1 源码位置

文件路径: include/linux/mm_types.h行号: 401内核版本: Linux 7.0

2.2 struct folio 定义

/* include/linux/mm_types.h:401 */struct folio {    union {        struct {            memdesc_flags_t flags;            union {                struct list_head lru;                struct {                    void *__filler;                    unsigned int mlock_count;                };                struct dev_pagemap *pgmap;            };            struct address_space *mapping;            union {                pgoff_t index;                unsigned long share;            };            union {                void *private;                swp_entry_t swap;            };            atomic_t _mapcount;            atomic_t _refcount;#ifdef CONFIG_MEMCG            unsigned long memcg_data;#endif#ifdef WANT_PAGE_VIRTUAL            void *virtual;#endif#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS            int _last_cpupid;#endif        };        struct page page;    /* 与 struct page 共用同一块内存 */    };    /* 后续还有 _flags_1, _head_1 等扩展字段,       用于大 folio(large folio)的额外信息 */};

关键设计:struct folio 通过 union 包含 struct page page,这意味着 folio 和 page 共享同一块内存地址。一个 folio 可以直接当作 page 使用,这保证了向后兼容性。

2.3 内存布局图

上图展示了:

  • 左侧:mem_map 中连续的 struct page 数组,每个 page 占 64 字节

  • 中间:struct folio 覆盖在 struct page 上,通过 union 共享同一片内存

  • 右侧:转换函数 page_folio() 和 folio_page() 实现零成本转换

  • 底部:folio_alloc 直接返回 struct folio *,无需额外包装

注意图中绿色字段是 folio 与 page 完全共享的部分(相同偏移),橙色部分是 folio 扩展的专用字段(如 _nr_pages)。


3. Folio 与 struct page 的关系

3.1 核心概念

概念
说明
folio
内存管理的统一抽象,包含 1 个或多个连续物理页
struct page
单个物理页的描述,仍存在于内核中
单页 folio
nr_pages == 1
 的 folio,等价于一个 page
大 folio (large folio)
nr_pages > 1
 的 folio,对应 compound page / THP / hugetlb

每个 page 都属于某个 folio。这是 folio 机制的核心不变量。即使是传统的单页,也在逻辑上被视为一个只包含 1 页的 folio。

3.2 转换 API

/* include/linux/page-flags.h:300 */#define page_folio(p)   (_Generic((p),                    \    const struct page *:  (const struct folio *)_compound_head(p), \    struct page *:        (struct folio *)_compound_head(p)))

page_folio() 使用 C11 _Generic 实现类型安全的转换。底层调用 _compound_head() 获取 folio 地址。

/* include/linux/mm.h:240 */staticinlineunsignedlongfolio_page_idx(conststruct folio *folio,        const struct page *page){    return page - &folio->page;}

folio_page_idx() 返回某个 page 在 folio 中的索引(从 0 开始)。

4. 关键 API 对照

4.1 分配与释放

struct page API
struct folio API
说明
alloc_pages(gfp, order)folio_alloc(gfp, order)
分配一个 folio
__free_pages(page, order)folio_put(folio)
减少引用计数,到零时释放
/* include/linux/gfp.h:323-350 */struct folio *folio_alloc_noprof(gfp_t gfp, unsigned int order);#define folio_alloc(...)    alloc_hooks(folio_alloc_noprof(__VA_ARGS__))

folio_alloc() 分配指定 order 的 folio,底层通过 __folio_alloc_node() 实现。

4.2 引用计数

/* include/linux/mm.h:2087 */staticinlinevoidfolio_put(struct folio *folio){    if (folio_put_testzero(folio))        __folio_put(folio);}

folio_put() 将 folio 的引用计数减一。如果计数归零,调用 __folio_put() 释放内存。这与原来的 put_page() 逻辑一致,但 API 更加统一——不需要区分 head page 和 tail page。

4.3 类型判断

/* include/linux/page-flags.h:862 */staticinlineboolfolio_test_large(conststruct folio *folio){    return folio_test_head(folio);}

folio_test_large() 判断 folio 是否包含多个页面(large folio)。返回 true 意味着这是一个 compound page 或 THP。

4.4 属性查询

/* include/linux/mm.h:1722 */staticinlineunsignedintfolio_order(conststruct folio *folio)/* include/linux/mm.h:2813 */static inline size_t folio_size(conststruct folio *folio)/* include/linux/mm.h:2530 */static inline unsigned long folio_pfn(conststruct folio *folio)
API
返回值
说明
folio_order()
unsigned int
分配 order(2^order 个页面)
folio_size()
size_t
folio 的总字节数
folio_pfn()
unsigned long
folio 的物理页帧号

4.5 Folio 生命周期流程图

上图展示了 folio 的完整生命周期:

  1. 分配阶段folio_alloc() 通过 buddy allocator 分配 2^order 个连续页面,返回 struct folio *

  2. 初始化阶段:设置 mapping、index、加锁、标记 accessed

  3. I/O 阶段:writeback 流程中的状态转换(locked → writeback → unlocked)

  4. 释放阶段folio_put() 减少引用计数,归零时通过 __folio_put() 释放

红色节点为热路径(hot path),是内核中最频繁调用的 API。


5. 为什么需要 Folio:问题分析

5.1 老代码的问题

在引入 folio 之前,处理 compound page 的典型代码如下:

/* 旧模式:需要手动处理 head/tail */struct page *head = compound_head(page);if (PageHead(page)) {    /* 处理 head page */    atomic_sub(compound_nr(page), &page->_refcount);else {    /* 处理 tail page */    /* 需要确保先获取 head,再操作 */}

这段代码有三个问题:

  1. 容易忘记调用 compound_head():如果传入 tail page 但没有先获取 head,操作会出错

  2. head/tail 分支重复:同一个函数需要两套处理逻辑

  3. 语义不清晰compound_head(page) 返回的是什么?为什么有时等于 page

5.2 Folio 模式

/* 新模式:直接操作 folio */struct folio *folio = page_folio(page);unsigned int nr = folio_nr_pages(folio);folio_ref_sub(folio, nr);

改进:

  1. 统一入口:无论单页还是多页,都先获取 folio

  2. 消除分支:不需要判断 head/tail,folio API 自动处理

  3. 语义清晰page_folio(page) 明确表示"获取该页面所属的 folio"

5.3 性能影响

folio 机制在以下方面带来性能优化:

  • 减少 compound_head() 调用:原来每次操作 compound page 都需要调用,现在 folio 本身已经是 head

  • 减少 flag 位冲突:folio 的 flags 字段含义统一,不需要为 head/tail 设置不同标志

  • 更好的 cache 局部性:folio 结构体设计减少了不必要的字段访问

5.4 Folio 替换 struct page 的演进路线

上图展示了 folio 从提出到逐步替换 struct page 的完整时间线:

阶段
内核版本
主要内容
Phase 0
v5.15 之前
Matthew Wilcox 提出 folio RFC
Phase 1
v5.15-v5.17
struct folio 定义引入,API 骨架,兼容层转换函数
Phase 2
v5.18-v6.0
MM 核心迁移:引用计数、锁操作、flags、LRU
Phase 3
v6.1-v6.4
文件系统迁移:filemap、iomap、ext4/xfs、buffer_head
Phase 4
v6.5-v6.7
驱动与网络:netfs、网络设备、DMA-buf/IOMMU
Phase 5
v6.8+
最终目标:淘汰 compound_head()

绿色节点表示已完成,橙色表示正在进行中,灰色表示规划中。


6. 实践验证

6.1 验证环境

  • 内核版本:Linux 7.0

  • 源码路径:

    • include/linux/mm_types.h(struct folio 定义)

    • include/linux/page-flags.h(page_folio、folio_test_large)

    • include/linux/mm.h(folio_put、folio_order)

    • include/linux/gfp.h(folio_alloc)

6.2 源码中 folio 的替换进度

在 Linux 7.0 中:

# include/linux/ 目录下grep -r "folio_" include/linux/ --include="*.h" | wc -l    # 1033 处grep -rc "struct page" include/linux/ | awk -F: '{s+=$2} END {print s}'  # 994 处

folio API 的数量已经略微超过 struct page 的引用,说明核心路径(page cache、buffer、部分文件系统)已基本完成迁移,但仍有部分代码使用 struct page。

6.3 编写代码时如何选择

场景
使用
编写新的 mm 子系统代码
优先使用 folio API
维护已有的 struct page 代码
可以保持不动,逐步迁移
编写驱动(非 mm 核心)
使用 page API 即可,通过 page_folio() 转换
文件系统开发
优先使用 folio API(VFS 层已大量使用 folio)

7. 常见问题

7.1 Folio 是取代 struct page 吗?

不是。folio 是对 struct page 的封装和统一,不是替代。struct folio 通过 union 包含 struct page,两者共享内存地址。内核中仍然保留了大量 struct page 相关的代码,迁移是渐进式的。

7.2 为什么 struct folio 和 struct page 要用 union?

为了零成本兼容

  • folio 可以直接当作 page 使用(通过 &folio->page

  • 不需要修改已有的 struct page * 函数签名

  • 内存地址相同,所有基于 page 的硬件 DMA、驱动接口不受影响

7.3 旧代码还能用吗?

可以。内核保留了完整的 struct page API 向后兼容。新旧代码可以共存,通过 page_folio() 和 folio_page() 互相转换。

7.4 Folio 和 THP 的关系?

THP(Transparent Huge Page)是 folio 的使用场景之一。一个 THP 对应一个 large folio(order >= 9,即 2MB+)。folio 机制使得 THP 的处理路径和普通页面完全统一。

8. 总结

本文解决了什么问题

分析了 Linux 内核 folio 机制的引入动机、设计原理和关键 API,帮助开发者理解从 struct page 到 struct folio 的抽象演进。

核心结论

  1. Folio 是 struct page 的封装而非替代,两者通过 union 共享内存地址

  2. 核心价值在于统一单页和多页的处理路径,消除 head/tail 分支

  3. 在 Linux 7.0 中,folio API 数量(1033 处)已略微超过 struct page(994 处),核心路径已基本完成迁移

实践中应该注意什么

  • 编写新的 mm 代码时优先使用 folio API

  • 现有 struct page 代码可以保持不动,逐步迁移

  • 通过 page_folio() 和 folio_page() 实现新老 API 的桥接

  • folio 不是银弹,驱动开发中仍然可以只用 struct page

9. 参考资料

  • Linux Kernel Documentation: Memory Management

  • Linux kernel source tree (v7.0): include/linux/mm_types.h, page-flags.h, mm.h, gfp.h

  • Matthew Wilcox: “Folio: A new memory management abstraction for the Linux kernel” (LPC 2021)

  • lore.kernel.org/linux-mm folio 补丁系列

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 12:30:56 HTTP/2.0 GET : https://f.mffb.com.cn/a/489654.html
  2. 运行时间 : 0.556717s [ 吞吐率:1.80req/s ] 内存消耗:4,663.23kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=91bfb29536460879db18e3f23459aee6
  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.000647s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000920s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.100881s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.073340s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000728s ]
  6. SELECT * FROM `set` [ RunTime:0.000246s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000609s ]
  8. SELECT * FROM `article` WHERE `id` = 489654 LIMIT 1 [ RunTime:0.000390s ]
  9. UPDATE `article` SET `lasttime` = 1783053056 WHERE `id` = 489654 [ RunTime:0.014697s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000295s ]
  11. SELECT * FROM `article` WHERE `id` < 489654 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.007246s ]
  12. SELECT * FROM `article` WHERE `id` > 489654 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.024950s ]
  13. SELECT * FROM `article` WHERE `id` < 489654 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.025374s ]
  14. SELECT * FROM `article` WHERE `id` < 489654 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.014564s ]
  15. SELECT * FROM `article` WHERE `id` < 489654 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.221425s ]
0.558406s