当前位置:首页>Linux>被Linux内核用C写的kfifo无锁设计惊艳到了~

被Linux内核用C写的kfifo无锁设计惊艳到了~

  • 2026-07-02 05:52:06
被Linux内核用C写的kfifo无锁设计惊艳到了~

正文

大家好,我是bug菌~
你一定遇到过这样的噩梦:多线程共享一个队列,为了线程安全不得不加锁,结果锁竞争导致性能暴跌,加锁确实是一门学问哈!然后好不容易优化了锁,又遇到了缓存伪共享;想动态分配内存,又怕在中断上下文里触发死锁。

你可能像我一样,手搓过无数个环形队列,其实在Linux内核里有一个叫kfifo的无锁环形队列,不到100行核心代码,设计非常的巧妙,几乎能够解决我上面提到的所有问题,所以我被它的惊艳所折服,所以必须写一篇文章来剥一下kfifo的神秘面纱了,看看它是如何用几个简单的数学技巧和内存屏障,在单生产者单消费者场景下实现真正的无锁并发。

1

为什么需要kfifo

在嵌入式开发中,生产者-消费者模型无处不在:

  • 串口中断接收数据,主线程处理
  • 传感器采集数据,后台线程存储
  • 网络数据包接收,应用层解析

不管是在RTOS还是嵌入式linux中,通常我们会定义一个环形缓冲区,加一个互斥锁保护读写操作。但这种方式有三个比较麻烦的问题:

1、首先是锁竞争的开销每次读写都要加锁解锁,在高频数据场景下,锁的开销甚至超过了数据处理本身。

2、然后是死锁的风险如果在中断上下文里尝试获取已经被持有的锁,直接导致系统崩溃。

3、最好是缓存伪共享,这个主要是在带cache缓存时,锁变量和队列变量放在同一个缓存行,导致频繁的缓存失效。

那么kfifo的出现几乎非常完美解决了这些问题。它在单生产者单消费者(SPSC)场景下,不需要任何锁,就能保证线程安全,性能比加锁队列高出一个数量级。

2

核心设计技巧

这里就要聊聊kfifo的设计哲学:通过限制使用场景来获得极致性能。这也是我为什么非常喜欢kfifo的原因,它也是嵌入式软件设计中一个非常重要的思想。

它只支持单生产者单消费者,缓冲区大小必须是2的幂次方。正是这两个看似苛刻的限制,换来了无与伦比的性能优势。

技巧一:unsigned int索引的自然回绕,彻底告别取模运算

传统环形队列最让人头疼的就是索引回绕问题。我们通常会这样写:

in = (in + 1) % size;out = (out + 1) % size;

但取模运算(%)在CPU上是一个非常昂贵的操作,需要几十个时钟周期,kfifo是怎么做的呢?

它把inout索引定义为unsigned int类型,并且永远不让它们回绕!让它们一直单调递增,直到溢出。

structkfifo {unsignedchar *buffer;unsignedint size;unsignedint in;  // 写入索引,一直递增unsignedint out; // 读取索引,一直递增};

那索引溢出了怎么办?

利用C语言中无符号整数的溢出特性:当unsigned int超过最大值时,会自动从0开始重新计数。这是C语言标准明确规定的行为,不是未定义行为!这正是kfifo最精妙的地方!

更神奇的是,无论inout怎么溢出,in - out永远等于队列中已有的数据长度!

// 已用空间:无论in和out怎么溢出,结果永远正确unsignedint used = fifo->in - fifo->out;// 空闲空间unsignedintfree = fifo->size - used;// 判断空满bool is_empty = (fifo->in == fifo->out);bool is_full = (used >= fifo->size);

一个简单的减法,就解决了传统环形队列中判断空满的复杂逻辑,nice~

那实际访问缓冲区时怎么办呢?因为缓冲区大小是2的幂次方,我们可以用位运算来代替取模,前面bug菌也写过类似的文章,当缓冲区大小必须是2的幂次方时候,编译器都会帮我们优化,不过需要注意前提条件:

// 等价于 in % size,但速度快10倍以上unsignedint pos = fifo->in & (fifo->size - 1);

位运算在CPU上是单周期指令,比取模运算快得多。这就是为什么kfifo要求缓冲区大小必须是2的幂次方的原因。

技巧二:分离的in/out索引,天然的安全区间分离

你应该bug菌开始的时候一样,会问:为什么两个线程同时修改inout不会有竞态条件?主要的原因是生产者只修改in,消费者只修改out

  • 生产者:只读out,只写in
  • 消费者:只读in,只写out

这就像两个人用同一张环形便签纸留言:

  • 写的人只负责在空白处写字,然后把笔往前移
  • 读的人只负责在有字的地方读,然后把笔往前移

只要两个人不交叉操作同一个位置,就不会有任何冲突。

  • 生产者看到的安全区间:[in, out + size)
  • 消费者看到的安全区间:[out, in)

这两个区间永远不会重叠,因为in - out <= size

技巧三:精准的内存屏障,杜绝"幽灵数据"

很多人以为kfifo不需要任何同步机制,这是大错特错的。kfifo不需要锁,但它需要内存屏障。现代CPU为了提高性能,会对指令进行乱序执行;编译器为了优化,也会对代码进行重排。如果没有内存屏障,可能会出现这样的情况:

// 生产者代码memcpy(fifo->buffer + pos, data, len); // 1. 写数据fifo->in += len;                       // 2. 更新索引

CPU可能会把这两条指令的顺序颠倒过来:先更新in索引,再写数据。

这会导致什么后果?消费者看到in索引更新了,以为有新数据可读,结果读到的还是旧数据——这就是所谓的"幽灵数据"。

那么kfifo是如何解决这个问题的呢?在写数据和更新索引之间,插入一个写内存屏障(smp_wmb())。

memcpy(fifo->buffer + pos, data, len);smp_wmb(); // 写内存屏障:保证前面的写操作全部完成fifo->in += len;

同样,在消费者这边,也需要一个读内存屏障(smp_rmb()):

memcpy(data, fifo->buffer + pos, len);smp_rmb(); // 读内存屏障:保证前面的读操作全部完成fifo->out += len;

内存屏障就像一堵墙,它不禁止所有乱序,只禁止墙两边的内存操作互相穿越。这是一种非常轻量级的同步机制,开销比锁小得多。

3

解读内核源码

让我们来看看Linux内核中kfifo的核心实现,说实在C真的优雅。我会去掉一些无关的宏定义,保留最核心的逻辑。

1、数据结构定义

struct __kfifo {unsignedint    in;     // 写入索引unsignedint    out;    // 读取索引unsignedint    mask;   // size - 1,用于位运算unsignedint    esize;  // 每个元素的大小void            *data;  // 缓冲区指针};

注意这里用了mask而不是size,因为mask = size - 1,这样每次计算位置时就不用再减1了,又是一个微小的性能优化。

2、计算空闲空间

staticinlineunsignedintkfifo_unused(struct __kfifo *fifo){return (fifo->mask + 1) - (fifo->in - fifo->out);}

fifo->mask + 1就是缓冲区大小,fifo->in - fifo->out就是已用空间,相减就是空闲空间,够简洁吧。

3、写入数据核心函数

unsignedint __kfifo_in(struct __kfifo *fifo, constvoid *buf, unsignedint len){unsignedint l;// 最多只能写入空闲空间大小的数据    len = min(len, kfifo_unused(fifo));// 第一步:计算从当前in位置到缓冲区末尾的长度    l = min(len, fifo->mask + 1 - (fifo->in & fifo->mask));// 先拷贝尾部数据memcpy(fifo->data + (fifo->in & fifo->mask), buf, l);// 如果还有剩余数据,从缓冲区头部开始拷贝memcpy(fifo->data, buf + l, len - l);// 写内存屏障:确保数据全部写入后再更新in索引    smp_wmb();// 更新写入索引    fifo->in += len;return len;}

即使不需要回绕,len - l等于0,memcpy也什么都不做。这就是kfifo代码的优雅之处:用统一的逻辑处理所有情况,避免分支预测失败带来的性能损失,所以你几乎看到if else。

4、读取数据核心函数

unsignedint __kfifo_out(struct __kfifo *fifo, void *buf, unsignedint len){unsignedint l;// 最多只能读取已用空间大小的数据    len = min(len, fifo->in - fifo->out);// 第一步:计算从当前out位置到缓冲区末尾的长度    l = min(len, fifo->mask + 1 - (fifo->out & fifo->mask));// 先拷贝尾部数据memcpy(buf, fifo->data + (fifo->out & fifo->mask), l);// 如果还有剩余数据,从缓冲区头部开始拷贝memcpy(buf + l, fifo->data, len - l);// 读内存屏障:确保数据全部读取后再更新out索引    smp_rmb();// 更新读取索引    fifo->out += len;return len;}

和写入函数几乎对称,同样几乎看不到if语句。

下面是一个简化版的示例供参考:

#include<stdint.h>#include<string.h>// 内存屏障定义:根据你的平台修改#if defined(__ARM_ARCH)// ARM Cortex-M系列使用__DMB()数据内存屏障#define smp_wmb() __DMB()#define smp_rmb() __DMB()#elif defined(__GNUC__)// GCC编译器使用内置函数#define smp_wmb() __sync_synchronize()#define smp_rmb() __sync_synchronize()#else// 其他平台:至少需要一个编译器屏障#define smp_wmb() asm volatile("" ::: "memory")#define smp_rmb() asm volatile("" ::: "memory")#endif// kfifo数据结构typedefstruct {uint8_t  *buffer;   // 缓冲区指针uint32_t size;      // 缓冲区大小(必须是2的幂次)uint32_t mask;      // size - 1uint32_t in;        // 写入索引uint32_t out;       // 读取索引kfifo_t;// 初始化kfifo// 注意:size必须是2的幂次!voidkfifo_init(kfifo_t *fifo, uint8_t *buffer, uint32_t size){    fifo->buffer = buffer;    fifo->size = size;    fifo->mask = size - 1;    fifo->in = 0;    fifo->out = 0;}// 写入数据uint32_tkfifo_put(kfifo_t *fifo, constuint8_t *data, uint32_t len){uint32_t l;// 计算可写入的最大长度    len = len < (fifo->size - (fifo->in - fifo->out)) ?           len : (fifo->size - (fifo->in - fifo->out));// 计算从当前位置到缓冲区末尾的长度    l = len < (fifo->size - (fifo->in & fifo->mask)) ?         len : (fifo->size - (fifo->in & fifo->mask));// 拷贝第一部分数据memcpy(fifo->buffer + (fifo->in & fifo->mask), data, l);// 拷贝第二部分数据(如果需要回绕)memcpy(fifo->buffer, data + l, len - l);// 写内存屏障:确保数据全部写入后再更新索引    smp_wmb();// 更新写入索引    fifo->in += len;return len;}// 读取数据uint32_tkfifo_get(kfifo_t *fifo, uint8_t *data, uint32_t len){uint32_t l;// 计算可读取的最大长度    len = len < (fifo->in - fifo->out) ? len : (fifo->in - fifo->out);// 计算从当前位置到缓冲区末尾的长度    l = len < (fifo->size - (fifo->out & fifo->mask)) ?         len : (fifo->size - (fifo->out & fifo->mask));// 拷贝第一部分数据memcpy(data, fifo->buffer + (fifo->out & fifo->mask), l);// 拷贝第二部分数据(如果需要回绕)memcpy(data + l, fifo->buffer, len - l);// 读内存屏障:确保数据全部读取后再更新索引    smp_rmb();// 更新读取索引    fifo->out += len;return len;}// 使用示例intmain(void){// 定义一个大小为128字节的静态缓冲区static uint8_t buffer[128];static kfifo_t fifo;// 初始化    kfifo_init(&fifo, buffer, sizeof(buffer));// 生产者线程/中断中写入数据uint8_t tx_data[] = "Hello, kfifo!";    kfifo_put(&fifo, tx_data, sizeof(tx_data));// 消费者线程中读取数据uint8_t rx_data[128];uint32_t len = kfifo_get(&fifo, rx_data, sizeof(rx_data));return0;}

最后总结下使用注意事项:

1、缓冲区大小必须是2的幂次(8, 16, 32, 64, 128...)
2、严格遵守单生产者单消费者模型
3、内存屏障一定要正确实现,否则会出现难以调试的"幽灵数据"问题
4、在多核系统中,需要使用硬件内存屏障而不仅仅是编译器屏障

5、多生产者多消费者场景怎么办?可以给kfifo加一把自旋锁,变成"轻量级加锁队列";或者使用多个kfifo,每个生产者对应一个队列。

最后分享一段话:

最好的代码不是最复杂的代码,而是用最简单的方法解决最复杂的问题

最后

      好了,今天就跟大家分享这么多了,如果你觉得有所收获,一定记得点个~

bug菌唯一、永久、免费分享嵌入式技术知识平台~

推荐专辑点击蓝色字体即可跳转

☞  MCU进阶专辑

☞  嵌入式C语言进阶专辑

☞  “bug说”专辑

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

☞ 专辑 | 从单片机到Linux

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 08:28:06 HTTP/2.0 GET : https://f.mffb.com.cn/a/492435.html
  2. 运行时间 : 0.212390s [ 吞吐率:4.71req/s ] 内存消耗:4,552.59kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=25c445d48d2baff7f5009886d5a2fde5
  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.000400s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000704s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000260s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000276s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000507s ]
  6. SELECT * FROM `set` [ RunTime:0.000208s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000742s ]
  8. SELECT * FROM `article` WHERE `id` = 492435 LIMIT 1 [ RunTime:0.004979s ]
  9. UPDATE `article` SET `lasttime` = 1783038486 WHERE `id` = 492435 [ RunTime:0.002308s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000313s ]
  11. SELECT * FROM `article` WHERE `id` < 492435 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.017750s ]
  12. SELECT * FROM `article` WHERE `id` > 492435 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001372s ]
  13. SELECT * FROM `article` WHERE `id` < 492435 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006756s ]
  14. SELECT * FROM `article` WHERE `id` < 492435 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.033169s ]
  15. SELECT * FROM `article` WHERE `id` < 492435 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.072912s ]
0.214813s