当前位置:首页>Linux>嵌入式环形缓冲区设计:从Linux内核kfifo到实战避坑指南

嵌入式环形缓冲区设计:从Linux内核kfifo到实战避坑指南

  • 2026-06-29 19:24:50
嵌入式环形缓冲区设计:从Linux内核kfifo到实战避坑指南
80%的嵌入式工程师都曾因缓冲区设计不当而踩坑! 今天,我们来深入剖析环形缓冲区的设计精髓,让你彻底掌握这个在嵌入式系统中无处不在的数据结构。

你是否曾在项目中遇到过这样的问题:数据丢失、内存溢出、性能瓶颈?这些问题往往源于对环形缓冲区的理解不够深入。本文将带你从Linux内核的kfifo设计思想出发,结合实战代码,彻底搞懂环形缓冲区的实现原理和最佳实践。

一、为什么环形缓冲区如此重要?

在嵌入式系统中,环形缓冲区(Ring Buffer/Circular Buffer)是解决生产者-消费者问题的经典数据结构。它广泛应用于:

  • 串口通信数据缓存

  • 音频/视频流处理

  • 网络数据包缓冲

  • 传感器数据采集

  • 任务间通信

环形缓冲区的核心优势在于:

  1. 高效的内存利用率 - 重复利用固定大小的内存空间

  2. 无锁操作 - 在单生产者/单消费者场景下无需加锁

  3. 数据连续性 - 保持数据的生产消费顺序

  4. 实时性保证 - 避免动态内存分配带来的不确定性

二、Linux内核kfifo的设计精髓

Linux内核中的kfifo是一个工业级的环形缓冲区实现,其设计思想值得我们深入学习和借鉴:

2.1 关键设计要点

kfifo的核心设计哲学:

  1. 2的N次幂缓冲区大小 - 通过位运算替代取模运算,大幅提升性能

  2. 无锁设计 - 单生产者/单消费者场景下的极致性能

  3. 内存屏障 - 确保多核环境下的数据一致性

  4. 类型安全 - 使用泛型设计支持任意数据类型

2.2 为什么选择2的N次幂?

这是环形缓冲区设计中最重要的优化技巧:

// 传统取模运算(效率低)index = (index + 1) % buffer_size; // 位运算优化(效率高)index = (index + 1) & (buffer_size - 1);

性能对比:

  • 取模运算:需要除法指令,通常需要10+个时钟周期

  • 位运算:只需要1个时钟周期,性能提升10倍以上

三、实战代码深度解析

我们来逐行分析这个嵌入式环形缓冲区的实现:

3.1 数据结构设计

/*********************************************************************************** * @brief    环形缓冲区管理器<ring_buf_t>(参考linux/kfifo)* @note     在单生产者/单消费者模式下使用不需要加锁,多生产者/多消费者模式下需要加锁*           避免数据丢失或数据损坏。************************************************************************************/typedef struct{    uint8_t *u8Buf_ptr;                  // 环形缓冲区    uint32_t u32Size;                    // 环形缓冲区大小    uint32_t u32Front;                   // 头指针    uint32_t u32Rear;                    // 尾指针}ring_buf_t;

关键设计决策:

  • 明确使用场景 - 文档清晰说明了单生产者/单消费者模式的特殊优势

  • 线程安全提示 - 明确告知多线程环境下的注意事项

  • 参考标准 - 明确参考Linux内核kfifo

3.2 初始化函数:隐藏的陷阱

boolbRingBuf_Init(ring_buf_t *r, uint8_t *buf, uint32_t len){    r->u8Buf_ptr=buf;    r->u32Size=len;    r->u32Front =r->u32Rear=0;        return buf!=NULL && (len&len-1) ==0;}

避坑指南:

  1. 缓冲区大小验证 - (len & len -1) == 0 巧妙验证是否为2的N次幂

  2. 空指针检查 - 防止野指针导致的崩溃

  3. 状态初始化 - 确保缓冲区初始为空状态

常见错误:

// 错误示例:忘记验证缓冲区大小boolinit_ring_buffer(ring_buf_t *r, uint8_t *buf, uint32_t len){    r->buffer = buf;    r->size = len;  // 如果len不是2的N次幂,后续位运算会出错!    return true;}

3.3 写入操作:分段拷贝的艺术

/** *@brief      将指定长度的数据放到环形缓冲区中  *@param[in]  r - 环形缓冲区管理器 *@param[in]  buf - 数据缓冲区 *@param[in]  len - 缓冲区长度  *@retval     实际放到中的数据  */uint32_tu32RingBuf_Write(ring_buf_t *r,uint8_t *buf,uint32_t len){    uint32_t i;    uint32_t left;    left = r->u32Size + r->u32Front  - r->u32Rear;                    // 缓冲区空闲空间    len  = MIN(len , left);                                           // 取实际可写入长度    i    = MIN(len, r->u32Size - (r->u32Rear & r->u32Size - 1));      // 计算从rear到缓冲区末尾的长度    memcpy(r->u8Buf_ptr + (r->u32Rear & r->u32Size - 1), buf, i);     // 分段写入数据(从rear到缓冲区末尾)    memcpy(r->u8Buf_ptr, buf + i, len - i);                           // 分段写入数据(从缓冲区开头继续写入剩余数据)    r->u32Rear += len;                                                // 更新rear指针    return len; }

技术要点分析:

  1. 空闲空间计算 - r->u32Size + r->u32Front - r->u32Rear 巧妙处理环绕

  2. 分段拷贝策略 - 处理缓冲区边界环绕的关键

  3. 位运算优化 - r->u32Rear & r->u32Size - 1 替代取模运算

3.4 读取操作:对称设计思想

/** *@brief      从环形缓冲区中读取指定长度的数据 *@param[in]  r - 环形缓冲区管理器 *@param[in]  buf - 数据缓冲区 *@param[in]  len - 缓冲区长度  *@retval     实际读取到的数据  */uint32_tu32RingBuf_Read(ring_buf_t *r,uint8_t *buf,uint32_t len){    uint32_t i;    uint32_t left;    left = r->u32Rear - r->u32Front;                                  // 缓冲区有效数据长度    len  = MIN(len , left);                                           // 取实际可读取长度    i    = MIN(len, r->u32Size - (r->u32Front & r->u32Size - 1));     // 计算从front到缓冲区末尾的长度    memcpy(buf, r->u8Buf_ptr + (r->u32Front & r->u32Size - 1), i);    // 分段读取数据(从front到缓冲区末尾)    memcpy(buf + i, r->u8Buf_ptr, len - i);                           // 分段读取数据(从缓冲区开头继续读取剩余数据)    r->u32Front += len;                                               // 更新front指针    return len; }

四、多线程环境下的挑战与解决方案

4.1 单生产者/单消费者模式

这是环形缓冲区的黄金场景:

  • 无需加锁 - front和rear指针分别被生产者和消费者独占访问

  • 极致性能 - 完全避免锁竞争

  • 内存屏障 - 仅需编译器屏障保证指令顺序

// 单生产者/单消费者模式示例voidproducer_thread(ring_buf_t *buffer){    while(1) {        uint8_t data[100];        // 生产数据        u32RingBuf_Write(buffer, data, sizeof(data));    }}voidconsumer_thread(ring_buf_t *buffer){    while(1) {        uint8_t data[100];        // 消费数据        u32RingBuf_Read(buffer, data, sizeof(data));    }}

4.2 多生产者/多消费者模式

必须加锁!否则会导致数据损坏:

// 多线程安全版本typedef struct {    ring_buf_t buffer;    pthread_mutex_t lock;  // 或其他锁机制thread_safe_ring_buf_t;uint32_tthread_safe_write(thread_safe_ring_buf_t *ts_buf,                           uint8_t *data, uint32_t len) {    pthread_mutex_lock(&ts_buf->lock);    uint32_t written = u32RingBuf_Write(&ts_buf->buffer, data, len);    pthread_mutex_unlock(&ts_buf->lock);    return written;}

五、实际项目中的最佳实践

5.1 缓冲区大小选择

经验法则:

  1. 2的N次幂 - 必须遵守

  2. 考虑最坏情况 - 缓冲区大小 >= 最大突发数据量 × 2

  3. 内存对齐 - 考虑CPU缓存行大小

// 推荐的大小选择#define RING_BUF_SIZE_1K    1024    // 1KB#define RING_BUF_SIZE_2K    2048    // 2KB  #define RING_BUF_SIZE_4K    4096    // 4KB#define RING_BUF_SIZE_8K    8192    // 8KB

5.2 性能优化技巧

  1. 批量操作 - 尽量减少读写调用次数

  2. 内存预取 - 合理利用CPU缓存

  3. 零拷贝设计 - 在某些场景下避免数据拷贝

5.3 调试与测试

必备的调试函数:

// 测试缓冲区大小(必须是2的N次幂)#define TEST_BUF_SIZE 32intmain(void){    uint8_t buffer[TEST_BUF_SIZE];    ring_buf_t ring;    uint8_t write_data[64];    uint8_t read_data[64];    uint32_t ret;    printf("========== 环形缓冲区测试程序 ==========\n\n");    // 1. 测试初始化    printf("[测试1] 初始化环形缓冲区...\n");    if (bRingBuf_Init(&ring, buffer, TEST_BUF_SIZE)) {        printf("        初始化成功!缓冲区大小: %u\n", TEST_BUF_SIZE);    } else {        printf("        初始化失败!\n");        return -1;    }    // 2. 测试基本写入和读取    printf("\n[测试2] 基本写入和读取测试...\n");    memset(write_data, 0xAA10);    ret = u32RingBuf_Write(&ring, write_data, 10);    printf("        写入 %u 字节数据 (期望: 10)\n", ret);    memset(read_data, 0sizeof(read_data));    ret = u32RingBuf_Read(&ring, read_data, 10);    printf("        读取 %u 字节数据 (期望: 10)\n", ret);    if (memcmp(write_data, read_data, 10) == 0) {        printf("        数据验证: PASS\n");    } else {        printf("        数据验证: FAIL\n");    }    // 3. 测试环形绕回(数据跨越缓冲区边界)    printf("\n[测试3] 环形绕回测试...\n");    // 先填满大部分缓冲区    for (int i = 0; i < 28; i++) {        write_data[i] = i;    }    ret = u32RingBuf_Write(&ring, write_data, 28);    printf("        写入 %u 字节数据 (期望: 28)\n", ret);    // 再写入8字节,触发绕回    for (int i = 0; i < 8; i++) {        write_data[i] = 0x80 + i;    }    ret = u32RingBuf_Write(&ring, write_data, 8);    printf("        再次写入 %u 字节数据 (期望: 4,因为只剩4字节空闲)\n", ret);    // 读取所有数据    memset(read_data, 0sizeof(read_data));    ret = u32RingBuf_Read(&ring, read_data, 32);    printf("        读取 %u 字节数据 (期望: 32)\n", ret);    // 验证数据完整性    int pass = 1;    for (int i = 0; i < 28; i++) {        if (read_data[i] != i) {            pass = 0;            break;        }    }    for (int i = 0; i < 4; i++) {        if (read_data[28 + i] != 0x80 + i) {            pass = 0;            break;        }    }    printf("        环形绕回验证: %s\n", pass ? "PASS" : "FAIL");    // 4. 测试清空功能    printf("\n[测试4] 清空缓冲区测试...\n");    u32RingBuf_Write(&ring, write_data, 10);    printf("        写入数据后长度: %u (期望: 10)\n"u32RingBuf_Len(&ring));    vRingBuf_Clear(&ring);    printf("        清空后长度: %u (期望: 0)\n"u32RingBuf_Len(&ring));    // 5. 测试空读取和满写入    printf("\n[测试5] 边界条件测试...\n");    // 空读取    memset(read_data, 0xFFsizeof(read_data));    ret = u32RingBuf_Read(&ring, read_data, 5);    printf("        空缓冲区读取: %u 字节 (期望: 0)\n", ret);    // 满写入测试    for (int i = 0; i < 40; i++) {        write_data[i] = i;    }    ret = u32RingBuf_Write(&ring, write_data, 40);    printf("        写入40字节到32字节缓冲区: %u 字节 (期望: 32)\n", ret);    // 再次写入(已满)    ret = u32RingBuf_Write(&ring, write_data, 10);    printf("        缓冲区满时写入: %u 字节 (期望: 0)\n", ret);    printf("\n========== 测试完成 ==========\n");    return 0;}

六、常见问题与解决方案

Q1: 如何避免缓冲区溢出?

A: 始终检查u32RingBuf_FreeSpace()返回值,确保有足够空间再写入。

Q2: 如何处理数据丢失?

A: 实现丢弃策略(如丢弃最旧数据)或阻塞等待策略。

Q3: 如何实现超时机制?

A: 结合条件变量或信号量实现带超时的读写操作。

Q4: 如何扩展到多核环境?

A: 使用无锁队列(如Linux内核的kfifo增强版)或结合内存屏障。

七、总结与展望

环形缓冲区是嵌入式系统开发的基本功,掌握其设计精髓能让你:

  1. 写出更高效的代码 - 避免不必要的性能损耗

  2. 设计更稳定的系统 - 减少内存相关bug

  3. 应对更复杂的场景 - 为高并发系统打下基础

未来发展方向:

  • 无锁多生产者/多消费者 - 使用CAS原子操作

  • DMA支持 - 硬件加速数据传输

  • 动态扩容 - 在特定场景下支持缓冲区动态调整


讨论: 你在项目中使用环形缓冲区时遇到过哪些奇葩问题?或者对文中的实现有什么改进建议?欢迎在下方留言区畅所欲言! 觉得文章有帮助?点赞👍、转发、收藏📁支持一下吧!


原创声明: 本文由 [嵌入式小金] 原创发布,欢迎分享。如需转载,请联系授权。

作者/编辑: [小金]

往期推荐:

告别模块耦合!发布订阅模型如何让嵌入式代码更优雅

《环形缓冲队列:嵌入式通信的"数据立交桥"|51/32单片机高效处理秘诀》

获取资源: 关注公众号,私信回复kfifo,即可获取本文完整工程代码+测试用例

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-02 23:27:42 HTTP/2.0 GET : https://f.mffb.com.cn/a/501048.html
  2. 运行时间 : 0.390111s [ 吞吐率:2.56req/s ] 内存消耗:4,752.39kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=8ed80c8fea7b52c7fd60a9179bd9574e
  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.000720s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001073s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.007804s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.006086s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001135s ]
  6. SELECT * FROM `set` [ RunTime:0.019036s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001291s ]
  8. SELECT * FROM `article` WHERE `id` = 501048 LIMIT 1 [ RunTime:0.009471s ]
  9. UPDATE `article` SET `lasttime` = 1783006062 WHERE `id` = 501048 [ RunTime:0.032543s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.002513s ]
  11. SELECT * FROM `article` WHERE `id` < 501048 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.019798s ]
  12. SELECT * FROM `article` WHERE `id` > 501048 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.009679s ]
  13. SELECT * FROM `article` WHERE `id` < 501048 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.047251s ]
  14. SELECT * FROM `article` WHERE `id` < 501048 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.094345s ]
  15. SELECT * FROM `article` WHERE `id` < 501048 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.046577s ]
0.391727s