当前位置:首页>Linux>Linux内核小技巧:宏的使用

Linux内核小技巧:宏的使用

  • 2026-08-20 06:12:13
Linux内核小技巧:宏的使用

众所周知C语言宏本身难用、难调试、难维护。但翻开 Linux 内核源码,宏随处可见:从wait_eventcontainer_of,到min/max,再到各子系统专属封装。矛盾由此产生:既然宏弊端明显,Linux 内核为何重度依赖?

Linux内核不禁止宏,而是用"编码规范+编译期检查+成熟工具"把宏关进笼子里。下面详细说明。

一、取舍与权衡:Linux 内核为何必须使用宏

1. 性能的 “最后一公里”

宏在预处理阶段完成文本替换,完全没有运行时开销。普普通函数和内联函数的参数类型在编译期固定,无法像宏那样根据传入参数的类型动态生成代码; 而宏可在编译期根据参数类型动态生成代码,实现类型无关的通用逻辑。像 container_of、min/max 这类需要适配任意数据类型的底层原语,只能依靠宏实现。

2. “创造” 新语法的能力

这是宏无可替代的核心优势。C 是过程式语言,宏却能封装底层逻辑,模拟全新控制结构:

// 并非C标准关键字,使用观感如同原生语法wait_event(my_wq, x > 10);

宏可将睡眠、调度等复杂底层逻辑,封装成简洁的语句式接口。

list_for_each_entry 则是循环遍历的典型代表,它模拟了 for 循环的原生语法,完全隐藏了链表指针移动的底层细节:

list_for_each_entry(stu, &student_list, list) {    // 自定义遍历逻辑}

无需手动操作链表指针,大幅降低出错概率。详情可参考Linux内核链表:设计、实现

3. 编译期代码生成与条件编译

除了控制流的封装,宏在编译期对代码的 “裁剪” 能力同样是运行时方案无法企及的。内核需要兼容数十种硬件架构、海量配置选项。 宏可在编译阶段筛选代码,决定片段保留或剔除,该能力无法靠运行时分支判断实现。 如下代码在编译的时候可以控制不需要magic成员变量。

struct mutex_waiter {        struct list_head        list;        struct task_struct      *task;        struct ww_acquire_ctx   *ww_ctx;#ifdef CONFIG_DEBUG_MUTEXES        void                    *magic;#endif};

二、内核宏的安全设计:规避宏的原生缺陷

既然无法舍弃宏,内核开发者沉淀了一套完整安全规范,大幅规避宏的原生缺陷。

1. do { ... } while (0) —— 多语句宏的护身符

定义包含多条语句的宏时,必须用该结构包裹:

#define FOO(x) do { \    do_this(x); \    do_that(x); \} while (0)

为什么不能直接用普通大括号{}

若只用{}包裹,调用后加分号会生成独立空语句块,引发else悬空语法错误;

// 错误写法:仅用 {} 包裹#define FOO(x) { do_this(x); do_that(x); }if (cond)    FOO(a);else    bar();// 展开后:// if (cond)//     { do_this(a); do_that(a); };// else//     bar();// 多余分号切割if语句,else失去匹配对象,编译报错

break实现宏内部提前退出

do...while(0)本质是单次循环,内部可使用break直接跳出宏逻辑,不影响外部函数执行流:

#define wait_event(wq_head, condition) do { \    might_sleep(); \    if (condition) \        break;  /* 条件成立,直接退出宏逻辑 */ \    __wait_event(wq_head, condition); \} while (0)

如果改用普通函数,return只能直接退出整个函数,无法实现 “中途跳出一段内嵌逻辑、继续执行函数剩余代码” 的效果。

do...while(0) 结构支持宏内部使用 break 提前终止逻辑,同时强制宏为单语句,兼容所有无括号的 if/for 场景。该模式是内核强制编码规范。

2. 利用({ ... })实现带返回值的宏

({ ... })全称语句表达式(Statement Expression),是 GCC 私有扩展,内核大量用于实现带返回值宏,经典示例max

#define max(a, b) ({ \    typeof(a) __a = (a); \    typeof(b) __b = (b); \    __a > __b ? __a : __b; \})

该写法两大优势:

  1. 先用临时变量缓存参数,避免表达式重复求值带来的副作用;

  2. typeof自动捕获参数原始类型,完整保留类型信息。

({ ... })语法详解

标准 C 中{}是纯语句块,无返回值,仅能用于分支、循环; GCC 扩展({ ... })允许在表达式内写入多条语句,最后一条表达式语句的值作为整体返回值(若最后为变量声明、循环等无值语句则无法返回)

({     int x = 10;      // 普通变量声明语句    int y = 20;      // 普通变量声明语句    x + y;           // 最终返回表达式结果})// 可直接赋值给变量int result = ({ int x = 10int y = 20; x + y; }); // result = 30

无语句表达式的原生宏存在致命缺陷

普通三元表达式实现MAX

#define MAX(ab) ((a) > (b) ? (a) : (b))

若参数携带自增、函数调用等副作用,参数会被重复求值:

int i = 1;int max_val = MAX(i++, 5); // 展开:((i++) > (5) ? (i++) : (5))// i自增两次,最终i=3,逻辑结果完全不符合预期

而上面的max宏用 typeof 定义局部临时变量缓存参数,保证每个输入参数只求值一。

拓展:带分支逻辑的返回值宏

借助语句表达式,宏内部可嵌入完整if分支并返回结果,标准 C 表达式无法实现:

#define SAFE_DIVIDE(x, y) ({ \    int __result; \    if ((y) == 0) { \        printk("Division by zero!\n"); \        __result = 0; \    } else { \        __result = (x) / (y); \    } \    __result; \})// 使用方式和普通函数一致int quotient = SAFE_DIVIDE(a, b);

三、宏的陷阱与避险指南

1. 副作用:参数重复求值

前文 max 宏示例已展示该问题:MAX(i++, 5) 中 i 被自增两次。核心解法是用 typeof 定义局部临时变量缓存参数,保证每个输入参数只求值一次。

2. 分号吞噬与悬空 else

前文第二节已详述,核心规避方案是统一使用 do { ... } while(0),宏定义末尾不加分号,分号由调用者补充。

3. 运算符优先级问题

#define SQUARE(x) x * xSQUARE(1+2); // 展开:1+2*1+2 = 5,预期结果为9

规避:所有宏参数、完整宏体外层全部包裹括号:#define SQUARE(x) ((x) * (x))

4. 局部变量名冲突

看一个看似合理的宏:

#define max(a, b) ({ \    typeof(a) _a = (a); \    typeof(b) _b = (b); \    _a > _b ? _a : _b; \})

调用处若恰好存在同名变量:

int _a = 100;int _b = 200;int result = max(_a, _b);

问题:初始化器中的 (_a) 被解析为新声明的局部变量自身,导致用未初始化的变量初始化自身,属于未定义行为。

内核通用解法:临时变量加双下划线前缀,大幅降低与外部变量重名的概率

#define max(a, b) ({ \    typeof(a) __a = (a); \    typeof(b) __b = (b); \    __a > __b ? __a : __b; \})

内核源码中大量使用 __ 前缀标记宏内部临时变量,这是统一编码约定,依靠开发者人工遵守。

补充说明:双下划线变量仅为约定层面的弱防护,无法从底层彻底杜绝命名冲突,属于低成本、高收益的通用方案。

5. 宏的调试技巧

排查宏逻辑错误最直接的方式是单独执行预处理阶段,查看宏完全展开后的代码:

gcc -E my_program.c -o my_program.i

生成的 .i 文件会保留所有预处理展开逻辑,可直接阅读定位宏引发的语法、逻辑问题。

四、编译期防护:内核宏的类型校验体系

宏最大的优势是 "类型无关"—— 同一套代码可以处理 int、long、size_t 等各种类型。但这也意味着编译器放弃了对类型的静态检查。如果宏内部混用了有符号和无符号、或者宽度不同的整数类型,可能产生告警,更糟的情况下会生成错误代码。

内核的解法是:宏自己把类型检查补回来。用 typeof 捕获类型,用 __builtin_types_compatible_p 判断类型是否匹配,再配合 BUILD_BUG_ON 在编译期拦截不匹配的情况。

1. __builtin_types_compatible_p() + typeof()

__builtin_types_compatible_p (type1, type2) 是 GCC 内置函数,两个类型完全匹配时返回 1,否则返回 0。它在编译阶段完成求值,没有任何运行时开销。

内核将其封装为通用工具宏:

#define __same_type(ab) __builtin_types_compatible_p(typeof(a), typeof(b))

有了这个工具,就可以在宏里判断两个参数的类型是否一致。

2. 类型不匹配时触发编译错误

光能判断类型还不够 —— 类型不匹配时,必须让编译失败,而不是放过去。这里用到内核的静态断言宏 BUILD_BUG_ON ():条件为真时触发编译错误。

内核中的 typecheck 宏就是干这个的:

#define typecheck(type, x) ({ \    BUILD_BUG_ON(!__same_type(type, x)); \    1\})

使用示例:

int a = 10;long b = 20;typecheck(int, a);   // ✅ 通过typecheck(int, b);   // ❌ 编译失败:类型不匹配

3. 实际场景:min 宏的完整形态

有了 typeof 做类型捕获、BUILD_BUG_ON 做编译期断言,min 宏可以进化出一个既保留类型灵活性、又自带安全检查的版本。

但这里有一个设计决策:类型检查的尺度应该多严格?

方案一:类型必须完全相同(过于严格)

#define min(x, y) ({ \    typeof(x) _x = (x); \    typeof(y) _y = (y); \    BUILD_BUG_ON(!__same_type(_x, _y)); \    _x < _y ? _x : _y; \})```这个版本的问题在于过于死板:```cint i = 10;long l = 20;int result = min(i, l);  // ❌ 编译失败,但 int 和 long 比较本身是安全的

C 语言的整数提升规则会自动将 int 提升为 long,这种比较不会有任何问题。强制类型完全一致,等于把编译器的正常能力给锁死了。

方案二:仅检查符号一致性(内核的真实做法)

真正危险的场景是符号不一致——有符号数和无符号数比较时,可能产生意料之外的结果:

int signed_val = -1;unsigned int unsigned_val = 1;// 直觉上:-1 < 1,结果为真// 实际上:-1 被隐式转换为无符号数,变成 0xFFFFFFFF,大于 1,结果为假if (signed_val < unsigned_val) {    // 永远不会执行!}

这种 bug 极其隐蔽,编译器可能只给一个 warning,甚至默认不报错。

因此,内核 min 宏的真实形态不是检查"类型是否相同",而是检查"符号是否兼容":

__types_ok:符号兼容性检查的核心

实现__types_ok宏的关键是is_signed_type和__sign_use这两个宏的实现。

is_signed_type

首先需要一个工具来判断类型的符号性。内核中 is_signed_type() 的实现非常巧妙:

#define is_signed_type(type) (((type)(-1)) < (__force type)1)

原理:

  • 有符号类型:(int)(-1) = -1,-1 < 1 为真

  • 无符号类型:(unsigned int)(-1) = 0xFFFFFFFF,0xFFFFFFFF < 1 为假

__sign_use

有了符号判断能力,内核通过 __sign_use 宏为每个表达式计算一个"签名兼容性等级",返回值是一个位掩码,实现如下:

#define statically_true(x) (__builtin_constant_p(x) && (x))#define __is_nonneg(ux) statically_true((long long)(ux) >= 0)#define __sign_use(ux) (is_signed_type(typeof(ux)) ? \        (2 + __is_nonneg(ux)) : (1 + 2 * (sizeof(ux) < 4)))

位掩码的含义:

  • bit #0(值为1):该值可安全用于无符号比较

  • bit #1(值为2):该值可安全用于有符号比较

statically_true 利用 GCC 内建函数 __builtin_constant_p,仅在编译期确定 x 为常量且 x 为真时才返回 1。这意味着 __is_nonneg 不会对 ux 求值,没有运行时开销。

__sign_use对于有符号类型

2 + __is_nonneg(ux)
  • 如果值编译期确定为非负(如常量 5):__is_nonneg(ux) 返回 1,结果 = 3(二进制 11)→ 两种比较都安全

  • 如果值可能为负(如变量):__is_nonneg(ux) 返回 0,结果 = 2(二进制 10)→ 仅安全用于有符号比较

__sign_use对于无符号类型:

1 + 2 * (sizeof(ux) < 4)
  • 如果类型小于 4 字节(如 unsigned short):sizeof(ux) < 4 为 1,结果 = 3(二进制 11)→ 因整数提升规则,两种比较都安全
  • 如果类型大于等于 4 字节(如 unsigned int):结果 = 1(二进制 01)→ 仅安全用于无符号比较

有了 __sign_use 为每个表达式计算出"签名等级",__types_ok 的实现变得极其简洁——只需按位与:

#define __types_ok(ux, uy) \        (__sign_use(ux) & __sign_use(uy))

如果两个表达式的位掩码有共同位(结果非零),说明它们至少存在一种安全的比较方式;如果结果为 0,则说明符号完全不兼容。

在 min 宏中配合 BUILD_BUG_ON 使用:

#define min(x, y) ({ \    typeof(x) __x = (x); \    typeof(y) __y = (y); \    BUILD_BUG_ON(!__types_ok(__x, __y)); \    __x < __y ? __x : __y; \})

当符号不兼容时(如负数 int 与 unsigned int 比较),BUILD_BUG_ON 在编译期触发错误,杜绝此类代码生成。

验证一下

int a = 10;unsigned int b = 20;min(a, b);     // ✅ a >= 0,符号兼容,通过int c = -5;unsigned int d = 10;min(c, d);     // ❌ c < 0,符号不兼容,编译报错

为什么这一套对宏尤其重要? 函数有编译器帮忙检查参数类型,类型不匹配时直接报错。但宏是文本替换,编译器默认不对参数做任何假设。

typeof + is_signed_type + BUILD_BUG_ON 的组合,本质上是宏作者手动补齐了编译器对函数参数的类型检查。宏保留了"任意类型都能用"的灵活性,同时补上了"危险的符号混用必须报错"的安全网。

这是内核宏设计的精髓所在:不禁止所有类型差异,而是精准拦截真正危险的那一类。

五、核心理念:有限制、可控地使用宏

理解了宏的陷阱与防护机制后,我们再回到一个根本问题:既然static inline性能足够,为什么不能完全替代宏? 内联函数类型固定、不支持编译期代码生成、无法劫持外部控制流;泛型、自定义语法糖、编译期代码裁剪等底层场景,宏无可替代。

梳理内核整套宏设计规范,提炼五条核心开发准则:

  1. 优先内联函数:能用 static inline 函数实现的逻辑,绝不使用宏 —— 仅适用于输入输出类型固定的场景,泛型需求仍需宏来兜底。

  2. 宏是兜底方案:仅泛型编程、接管外部控制流、编译期代码生成 / 裁剪等函数无法实现的场景,才选用宏。

  3. 强制附加类型检查:自定义宏必须搭配 typeofBUILD_BUG_ON__same_type 等工具做编译期类型约束。

  4. 统一编码规范:多语句宏使用 do...while(0)、所有参数外层加括号、内部临时变量统一双下划线前缀,三条为强制标准。

  5. 错误前置到编译期:借助静态断言,将所有类型、逻辑隐患在编译阶段提前暴露,绝不遗留运行时隐蔽 Bug。

Linux 内核教会我们的,不是如何避免使用宏,而是如何给锋利的剃刀装上智能护套 ——保留元编程的强大威力,通过一套完整编译期契约把错误扼杀在萌芽之中。

往期推荐:
Linux内核小技巧:goto的使用

Linux 内核小技巧:将错误码编码到指针中返回

字符串比较:!strcmp() 还是 strcmp() == 0?

为什么成功是0,失败是1?—— 一个反直觉设计的工程智慧

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 16:27:11 HTTP/2.0 GET : https://f.mffb.com.cn/a/508229.html
  2. 运行时间 : 0.163570s [ 吞吐率:6.11req/s ] 内存消耗:4,575.24kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=a388a9b5491c823333b3cb72f90da2df
  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.000730s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001367s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000683s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.030327s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001559s ]
  6. SELECT * FROM `set` [ RunTime:0.004375s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001498s ]
  8. SELECT * FROM `article` WHERE `id` = 508229 LIMIT 1 [ RunTime:0.005833s ]
  9. UPDATE `article` SET `lasttime` = 1787300831 WHERE `id` = 508229 [ RunTime:0.001844s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.001526s ]
  11. SELECT * FROM `article` WHERE `id` < 508229 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002659s ]
  12. SELECT * FROM `article` WHERE `id` > 508229 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.007676s ]
  13. SELECT * FROM `article` WHERE `id` < 508229 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000713s ]
  14. SELECT * FROM `article` WHERE `id` < 508229 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004161s ]
  15. SELECT * FROM `article` WHERE `id` < 508229 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005342s ]
0.164985s