当前位置:首页>Linux>Linux同步: completion — 一个简单的同步机制

Linux同步: completion — 一个简单的同步机制

  • 2026-07-07 09:51:03
Linux同步: completion — 一个简单的同步机制

Linux同步: completion — 一个简单的同步机制

一、什么是 completion

Linux 内核中的 completion 机制,专门用于解决一类简单且高频的同步场景:等待一项异步任务执行完成

在驱动与内核开发中,大量场景需要等待异步事件结束:磁盘数据读取完成、硬件初始化就绪、异步线程/工作队列执行完毕等。completion 就是为这类「等待事件完成」的场景量身设计的轻量同步原语。

二、数据结构与核心用法

1. 数据结构

completion 结构极为精简,仅由「完成计数器」和「简易等待队列」两个成员组成,无冗余开销。

struct completion {    unsigned int done;              // 完成计数:0=未完成,>0=存在待处理完成事件(唤醒后自动递减)    struct swait_queue_head wait;   // 简易等待队列:维护所有阻塞等待的线程};

done 字段精准语义

  • done = 0:无完成事件,调用wait_for_completion 会阻塞当前线程;

  • 单次 complete():将 done 递增 1,然后唤醒队列中第一个等待线程。被唤醒的线程在返回前会消费一个完成事件(将 done 递减 1);

  • complete_all():将 done 设置为内核特殊值(UINT_MAX/2),一次性唤醒队列中所有等待线程。

complete_all 唤醒所有等待者后,done 保持为 UINT_MAX/2(实际宏为 COMPLETION_DONE_TOTALLY),任何后续的 wait_for_completion 都会立即返回(因为 done > 0),而不是阻塞。因此 complete_all 通常配合模块卸载、设备移除等"终止性"场景使用,之后不再复用该 completion。

2. 典型核心用法

completion 的使用范式高度固定,核心只需掌握「初始化、等待、通知完成」三类 API。

// 1. 初始化方式struct completion comp;init_completion(&comp);                // 动态初始化// DECLARE_COMPLETION(comp);           // 全局/静态初始化// 2. 等待方:阻塞等待事件完成void reader(void) {    wait_for_completion(&comp);         // 事件未完成则睡眠,完成后唤醒继续执行    /* 读取处理异步执行结果 */}// 3. 完成方:事件结束,发送完成通知void writer(void) {    /* 执行异步任务、IO、硬件操作 */    complete(&comp);                    // 唤醒一个阻塞的等待线程}

当一个内核线程调用 wait_for_completion,就像顾客在服务窗口排队等待叫号,然后退到一旁等候(调度出去); complete() 是窗口工作人员叫一个号(按排队顺序唤醒一个等待者),该顾客办完业务离开,其他顾客继续等待下一次叫号。 complete_all() 则是窗口挂出"今日停业"的牌子,一次性告知所有排队顾客终止等待,所有人同时散去。

3. 栈上安全使用(核心特性)

completion 支持在函数栈上定义,是其区别于信号量的重要优势,内核提供专属栈上初始化宏:

struct block_io {    struct completion *comp;    int ret;    void *data;};staticvoidio_complete_callback(struct bio *bio){    struct block_io *io = bio->bi_private;    io->ret = blk_status_to_errno(bio->bi_status);    complete(io->comp);  // 中断上下文中唤醒}intblock_read_sync(struct block_device *bdev, sector_t sector, void *buf){    DECLARE_COMPLETION_ONSTACK(comp);                           // 栈上创建 completion 对象    struct block_io io = { .comp = &comp, .data = buf };    struct bio *bio = bio_alloc(GFP_KERNEL, 1);    // 提交 bio,回调设置 io_complete_callback	bio->bi_private = &io;    bio->bi_end_io = io_complete_callback;    submit_io(bio);                                             // 异步提交IO    wait_for_completion(&comp);                                 // 阻塞等待任务完成    return io.ret;                                              // 函数返回,栈上comp自动销毁}

栈上使用安全的核心设计:wait_for_completion 返回前,函数栈帧不会销毁,comp 对象内存有效;complete() 完成唤醒操作后,不会再访问 comp 对象,彻底杜绝野指针、内存释放后复用的问题,这是内核刻意设计的安全特性。

安全使用的核心前提:wait_for_completion 及其衍生函数返回后,调用者才能销毁栈帧。因此,只有能保证「事件一定完成」的场景,才适合用栈上 completion。

致命陷阱:可中断/可超时等待函数

intblock_read_sync_with_timeout(struct block_device *bdev, ...){    DECLARE_COMPLETION_ONSTACK(comp);    submit_bio(...);  // 异步提交,回调中会 complete(&comp)    unsigned long ret = wait_for_completion_timeout(&comp, HZ);    if (ret == 0) {        // 超时返回!栈帧即将销毁        return -ETIMEDOUT;  // BUG: 异步任务稍后 complete(&comp) 时,                            // comp 所在的栈内存已被释放,UAF!    }    return 0;}

wait_for_completion_*_timeout、wait_for_completion_interruptible、wait_for_completion_killable 等函数可能在事件完成前就因超时或信号而返回。一旦函数返回,调用者销毁栈帧,但异步任务可能还在执行,后续调用 complete(&comp) 时访问的是已释放的栈内存,导致 Use-After-Free。 正确做法:使用可中断/可超时等待函数时,必须将 completion 分配在堆上(kmalloc)或全局静态区,确保其在异步任务完成前始终有效。

三、为什么不直接用信号量实现?

1. 底层结构高度相似

completion 的底层模型与信号量几乎一致,均为「计数器 + 等待队列」,这也是很多人困惑为何需要单独设计 completion 的原因。

信号量数据结构:

/* Please don't access any members of this structure directly */struct semaphore {    raw_spinlock_t          lock;    unsigned int            count;      // 资源计数(对应 completion.done)    struct list_head        wait_list;   // 等待队列(对应 completion.wait)#ifdef CONFIG_DETECT_HUNG_TASK_BLOCKER    unsigned long           last_holder;#endif};

2. 信号量可模拟 completion 功能

内核完全可以通过 0 初始信号量模拟事件等待逻辑,代码可正常编译运行:

struct semaphore sem;sema_init(&sem, 0);    // 初始无资源,模拟「事件未完成」// 等待方:资源不足则阻塞,等价等待事件完成down(&sem);            // 完成方:释放资源唤醒线程,等价事件完成通知up(&sem);              

3. 语义与心智模型的本质差距

虽然功能可替代,但信号量实现事件等待属于「强行复用通用接口」,语义错位、可读性差:

  • 信号量down/up 语义是「资源获取/释放」,心智模型是资源计数管理,用于事件等待需要开发者二次解读;

  • completionwait_for_completion/complete 语义是「事件等待/事件完成」,心智模型是事件状态通知,代码自解释、无歧义。

同样的阻塞等待逻辑,down(&sem) 需要揣摩业务意图,而 wait_for_completion(&comp) 一眼可知是等待异步事件完成,大幅降低代码维护与交接的认知成本。

四、命名的价值:从晦涩技巧到直观意图

completion 的独立设计,核心价值不在于性能,而在于语义规范化、代码可读性,该设计理念来自 Linus 2002 年内核邮件的经典论述。

Linus 明确指出:使用信号量做事件等待,是一种「巧妙但晦涩的技巧(clever but obscure)」;而使用 completion 实现,是「显而易见、意图明确(obvious)」的标准写法。

他甚至强调:即便两者底层实现完全一致,也必须保留 completion 的独立 API 与命名,干净统一的语义本身就是不可替代的工程价值。

核心设计思想:代码首先是给人读的,其次才是给机器跑的

  • 信号量围绕「资源数量」设计,适用于资源竞争、限流、互斥场景;

  • completion 围绕「事件状态」设计,专一服务于异步等待场景。

相同的底层机制,通过不同的 API 命名约束,规范了开发者的使用心智,规避滥用、统一代码风格、降低维护风险,这就是命名与语义设计的核心意义。

五、完整 API 手册

1. 初始化 API

API
用途
说明
init_completion(&comp)
动态初始化
清零 done、初始化等待队列,适用于堆/全局变量
reinit_completion(&comp)
重新初始化
仅清零 done,不改动等待队列;需保证无并发等待线程
DECLARE_COMPLETION(comp)
静态全局初始化
用于文件级、全局作用域变量
DECLARE_COMPLETION_ONSTACK(comp)
栈上初始化
用于函数局部变量,需严格保证生命周期匹配

2. 等待 API(仅进程上下文可调用)

API
可被信号中断
超时机制
返回值说明
wait_for_completion(&comp)
无返回值,永久阻塞直至事件完成
wait_for_completion_interruptible(&comp)
0=事件正常完成,-ERESTARTSYS=被信号打断
wait_for_completion_timeout(&comp, timeout)
0=等待超时,>0=剩余计时jiffies(等待成功)
wait_for_completion_interruptible_timeout(&comp, timeout)
-ERESTARTSYS=信号打断,0=超时,>0=等待成功

注意:所有等待类 API 均会触发线程睡眠,禁止在中断上下文、原子上下文(自旋锁区间)调用

3. 完成通知 API

API
唤醒数量
使用说明
complete(&comp)
单个等待者
按 FIFO 顺序唤醒一个阻塞线程,可多次调用唤醒多个等待者
complete_all(&comp)
全部等待者
将 done 置为特殊值,一次性唤醒所有线程,禁止多次调用

4. 状态查询 API(中断/原子上下文安全)

API
返回值
说明
completion_done(&comp)
true / false
只读查询事件状态,不修改任何字段、不消费事件
try_wait_for_completion(&comp)
true / false
非阻塞尝试消费事件;成功消费返回true,无事件返回false,不睡眠

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-08 07:07:40 HTTP/2.0 GET : https://f.mffb.com.cn/a/503849.html
  2. 运行时间 : 0.168866s [ 吞吐率:5.92req/s ] 内存消耗:4,635.92kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fde8bfa2261cc4ab255ddc0875b84c1b
  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.001084s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001667s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000698s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000672s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001376s ]
  6. SELECT * FROM `set` [ RunTime:0.000726s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001480s ]
  8. SELECT * FROM `article` WHERE `id` = 503849 LIMIT 1 [ RunTime:0.008398s ]
  9. UPDATE `article` SET `lasttime` = 1783465660 WHERE `id` = 503849 [ RunTime:0.036875s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000895s ]
  11. SELECT * FROM `article` WHERE `id` < 503849 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001268s ]
  12. SELECT * FROM `article` WHERE `id` > 503849 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002977s ]
  13. SELECT * FROM `article` WHERE `id` < 503849 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002476s ]
  14. SELECT * FROM `article` WHERE `id` < 503849 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002572s ]
  15. SELECT * FROM `article` WHERE `id` < 503849 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.016716s ]
0.172595s