当前位置:首页>学习笔记>brpc 学习笔记(十二):TaskMeta——bthread 的核心数据结构

brpc 学习笔记(十二):TaskMeta——bthread 的核心数据结构

  • 2026-05-12 11:40:14
brpc 学习笔记(十二):TaskMeta——bthread 的核心数据结构

摘要:前文拆解了bthread栈管理。本文转向TaskMeta——每个bthread的核心数据结构。它由ResourcePool管理,字段分为Not Reset(跨复用保留)和Reset(每次重置)。version_butex实现join等待,current_waiter支持butex阻塞唤醒,local_storage保存线程局部存储。

brpc 学习笔记(十一):bthread 的栈管理——执行栈的分配、复用与保护

在上一篇文章中,我们拆解了 bthread 的栈管理——三种大小的栈通过 StackFactory 模板和 ObjectPool 复用,mmap+mprotect 实现 guard page 防溢出。

现在我们转向 bthread 最核心的数据结构:TaskMeta

每个 bthread 对应一个 TaskMeta 实例。它存储了 bthread 的全部运行时信息:入口函数、栈、状态、统计、TLS 等。理解 TaskMeta 是理解 bthread 调度、同步、生命周期的基础。


一、TaskMeta 全貌

struct TaskMeta {    // ===== [Not Reset] 跨复用保留 =====    butil::atomic<ButexWaiter*> current_waiter{NULL};    uint64_t current_sleep{TimerThread::INVALID_TASK_ID};    bool sleep_failed{false};    bool stop{false};    bool interrupted{false};    bool about_to_quit{false};    pthread_spinlock_t version_lock{};    uint32_t* version_butex{NULL};    // ===== [Reset] 每次创建时重置 =====    bthread_t tid{INVALID_BTHREAD};    void* (*fn)(void*){NULL};    void* arg{NULL};    ContextualStack* stack{NULL};    bthread_attr_t attr{BTHREAD_ATTR_NORMAL};    int64_t cpuwide_start_ns{0};    TaskStatistics stat{};    LocalStorage local_storage{};    TaskStatus status{TASK_STATUS_UNKNOWN};    bool traced{false};    pthread_t worker_tid{};};

TaskMeta 的字段分为两类:

类型
含义
何时初始化
[Not Reset]
贯穿 TaskMeta 整个生命周期
构造函数(只执行一次)
[Reset]
每个 bthread 独有
bthread_start_*
 创建时重置

为什么需要这种区分?因为 TaskMeta 从 ResourcePool 分配(参见本系列第三篇),bthread 结束后 TaskMeta 被归还到池中,下次创建新 bthread 时直接复用。[Not Reset] 字段在整个 TaskMeta 生命周期中只初始化一次,而 [Reset] 字段在每次创建新 bthread 时重置。


二、辅助数据结构

2.1 TaskStatistics:运行统计

struct TaskStatistics {    int64_t cputime_ns;     // 消耗的 CPU 时间(纳秒)    int64_t nswitch;        // 上下文切换次数    int64_t cpu_usage_ns;   // CPU 使用时间,用于计算利用率};

每次 bthread 被调度执行时记录 cpuwide_start_ns,被切换出去时计算差值累加到 cputime_nsnswitch 记录上下文切换次数。这些统计通过 bvar 暴露,便于性能分析。

2.2 LocalStorage:线程局部存储

struct LocalStorage {    KeyTable* keytable;           // bthread_key_create 创建的线程特定数据    void* assigned_data;          // 用户分配的数据指针    void* rpcz_parent_span;       // 分布式追踪 span(weak_ptr<Span>*)};

每个 bthread 有独立的 local_storage。bthread 被调度执行时,从 local_storage 恢复到 tls_bls__thread 变量,访问更快);被切换出去时,从 tls_bls 保存回 local_storage

为什么不能直接用 local_storage 因为 __thread 变量(tls_bls)的访问速度比结构体成员快得多——它是通过 TLS 段直接寻址的。bthread 框架内部一律使用 tls_bls,只在上下文切换时与 local_storage 同步。

2.3 TaskStatus:状态枚举

enum TaskStatus {    TASK_STATUS_UNKNOWN,       // 未知(初始值)    TASK_STATUS_CREATED,       // 已创建,尚未进入调度    TASK_STATUS_FIRST_READY,   // 首次就绪,等待首次调度    TASK_STATUS_READY,         // 就绪,在调度队列中等待    TASK_STATUS_JUMPING,       // 正在跳转(上下文切换中)    TASK_STATUS_RUNNING,       // 正在运行    TASK_STATUS_SUSPENDED,     // 已挂起(阻塞等待)    TASK_STATUS_END,           // 已结束};
状态转换:
CREATED → FIRST_READY → READY → RUNNING ⇄ SUSPENDED → END                                    ↘ JUMPING ↗

TaskTracer 通过定期采样 status 字段生成 bthread 的执行轨迹。


三、[Not Reset] 字段详解

这些字段在构造时初始化,复用时不重置。它们承载了跨 bthread 生命周期的"基础设施"。

3.1 current_waiter:当前等待者

butil::atomic<ButexWaiter*> current_waiter{NULL};

当前阻塞在 butex 上的等待者链表头。当 bthread 在 butex_wait 中阻塞时(如 mutex lock、semaphore wait),TaskGroup 会将当前的 ButexWaiter 插入到对应 butex 的等待队列。

为什么要原子操作?因为 bthread_interrupt 需要从外部(其他线程)修改此字段来唤醒阻塞的 bthread。

3.2 current_sleep:定时器任务 ID

uint64_t current_sleep{TimerThread::INVALID_TASK_ID};

当 bthread 调用 bthread_usleep 等睡眠函数时,会在 TimerThread 中注册一个定时任务(参见本系列第十篇),ID 保存在这里。INVALID_TASK_ID 表示没有在睡眠。

睡眠的取消(如被中断唤醒)通过这个 ID 调用 TimerThread::unschedule 实现。

3.3 version_lock 与 version_butex:版本号机制

pthread_spinlock_t version_lock{};uint32_t* version_butex{NULL};    // 初始值为 1

这两个字段是 bthread_join 机制的核心:

  • version_butex是一个独立分配的 butex(从 butex ObjectPool 获取),值是 TaskMeta 的版本号
  • version_lock是自旋锁,保护 version_butex 的可见性

为什么用 butex 而不是普通变量?bthread_join 需要阻塞等待 bthread 结束。butex 提供了高效的阻塞/唤醒机制——join 方通过 butex_wait(version_butex, expected_version) 挂起,bthread 结束时递增 version 并 butex_wake 唤醒等待者。

为什么不需要原子操作?version_butex 只会被一个 bthread 修改(正在运行的 bthread 本身),其他 bthread 只是读取。不需要 CAS,只需要保证可见性——通过 version_lock 自旋锁实现。

为什么初始值为 1?bthread_t 永远不为 0(因为 tid = make_tid(version, slot),version=0 意味着 tid 的版本部分为 0,可能与"未初始化"混淆)。初始版本号 1 确保第一个 bthread 的 tid 是有效的。

3.4 控制标志

bool sleep_failed{false};      // 定时调度失败标志bool stop{false};              // 内置停止标志bool interrupted{false};       // 中断标志bool about_to_quit{false};     // 延迟调度标志

这四个标志属于 [Not Reset] 类型(从源码和注释来看,实际上 sleep_failed 和部分标志在 reset 时也会被处理,但核心语义是跨生命周期的控制标志):

标志
设置者
含义
sleep_failed
TimerThread 调度失败
定时器注册失败,后续逻辑据此处理
stopbthread_stop()
bthread 应检查此标志并退出(如 Server 停止时通知 worker)
interruptedbthread_interrupt()
bthread 被外部中断,应从阻塞操作中唤醒
about_to_quit
bthread 即将退出时
调度器可延迟其执行,减少调度资源占用

四、[Reset] 字段详解

这些字段在每次 bthread_start_* 时重置,承载每个 bthread 独有的运行时信息。

4.1 标识与入口

bthread_t tid{INVALID_BTHREAD};    // bthread 标识符void* (*fn)(void*){NULL};           // 入口函数void* arg{NULL};                    // 入口函数参数

tid 是 bthread 的标识符,实际上是 TaskMeta 地址的编码(make_tid(version, TaskMeta*))。将 tid 存在 TaskMeta 中是为了方便——很多地方需要从 TaskMeta 获取 tid,直接存一份比每次编码更快。

fn 和 arg 是 bthread 的入口函数和参数。bthread_start_* 时设置,bthread 被调度执行时调用 fn(arg)

4.2 执行栈与属性

ContextualStack* stack{NULL};               // 执行栈bthread_attr_t attr{BTHREAD_ATTR_NORMAL};   // 创建属性

stack 指向 bthread 的执行栈(包含 fcontext 和栈内存,参见本系列第十一篇)。STACK_TYPE_PTHREAD 时为 NULL(使用 pthread 原生栈)。bthread 切换时,jump_stack 使用此字段找到目标栈。

attr 是创建时的属性,包含栈类型(stack_type)、标志、tag、名称等。bthread_start 时从参数复制。

4.3 统计信息

int64_t cpuwide_start_ns{0};    // 上次调度时的 CPU 时间戳TaskStatistics stat{};           // 累计统计

每次 bthread 被调度执行时记录 cpuwide_start_ns(通过 butil::cpuwide_time_ns()),被切换出去时计算差值累加到 stat.cputime_ns。这是 bthread 级别的 CPU 时间统计——不依赖操作系统,纯用户态实现。

4.4 线程局部存储

LocalStorage local_storage{};

bthread 的线程局部存储。前面已经分析过——在上下文切换时与 tls_bls 同步。

4.5 追踪字段

TaskStatus status{TASK_STATUS_UNKNOWN};  // 当前状态bool traced{false};                      // 是否被追踪pthread_mutex_t trace_lock{};            // 追踪锁pthread_t worker_tid{};                  // 当前 worker pthread ID

这些字段用于 TaskTracer(BRPC_BTHREAD_TRACER 宏启用时)。trace_lock 保证追踪完成后再进行上下文跳转,避免追踪器读到中间状态。worker_tid 记录当前执行此 bthread 的 worker pthread,用于分析 bthread 在 pthread 之间的迁移。


五、构造与析构

TaskMeta() {    pthread_spin_init(&version_lock, 0);    version_butex = butex_create_checked<uint32_t>();    *version_butex = 1;    pthread_mutex_init(&trace_lock, NULL);}~TaskMeta() {    pthread_mutex_destroy(&trace_lock);    butex_destroy(version_butex);    version_butex = NULL;    pthread_spin_destroy(&version_lock);}

构造函数只初始化 [Not Reset] 字段:自旋锁、version_butex、trace_lock。[Reset] 字段通过类内默认值初始化,在 bthread_start_* 时被覆盖。

析构函数按逆序释放:trace_lock → version_butex(归还 butex ObjectPool)→ version_lock。


六、version_butex 与 bthread_join

version_butex 是理解 bthread 生命周期管理的关键。它实现了一个高效的 join 机制:

bthread A 创建 bthread B:    TaskMeta* m = get_resource<TaskMeta>(...);    m->version_butex 的值就是当前版本号(比如 1bthread C 调用 bthread_join(B):    1. 定位到 B 的 TaskMeta    2. 读取 version_butex 的当前值 expected    3butex_wait(version_butex, expected)  // 阻塞等待版本变化bthread B 执行完毕:    1. 递增 *version_butex(1 → 2    2butex_wake(version_butex)  // 唤醒 join 方bthread C 被唤醒:    version_butex 已变化(2 ≠ 1),join 返回

这种设计与条件变量类似——用 butex 值的变化通知等待者。但比条件变量更轻量:不需要 mutex,只需要一个 butex。

为什么版本号不会回绕?因为 bthread 的生命周期通常很短(毫秒到秒级),而 uint32_t 的范围是 42 亿次。即使每秒创建/销毁 100 万个 bthread,也需要 4200 秒(约 70 分钟)才会回绕。而且 TaskMeta 从 ResourcePool 分配,同一 slot 的复用间隔足够长。


七、栈管理方法

voidset_stack(ContextualStack* s){    stack = s;}ContextualStack* release_stack(){    ContextualStack* tmp = stack;    stack = NULL;    return tmp;}StackType stack_type()const{    return static_cast<StackType>(attr.stack_type);}

三个简单的辅助方法:

  • set_stack
    :设置执行栈(bthread 开始运行时调用)
  • release_stack
    :释放并返回执行栈(bthread 结束、栈被归还到对象池时调用)
  • stack_type
    :从 attr.stack_type 获取栈类型(Small/Normal/Large)

八、字段分类总览

将所有字段按功能分类:

功能类别
字段
类型
版本/同步
version_lock, version_butex
Not Reset
butex 等待
current_waiter
Not Reset
定时睡眠
current_sleep, sleep_failed
Not Reset
控制标志
stop, interrupted, about_to_quit
Not Reset
标识
tid
Reset
入口
fn, arg
Reset
执行栈
stack, attr
Reset
统计
cpuwide_start_ns, stat
Reset
TLS
local_storage
Reset
追踪
status, traced, trace_lock, worker_tid
Not Reset/Reset

关键观察:Not Reset 字段都是"基础设施"——版本号、等待者、定时器、控制标志。它们需要在 bthread 复用时保留,因为外部可能还在引用旧的版本号或等待者。Reset 字段是"业务数据"——入口函数、栈、统计。每次创建新 bthread 时都应该从干净状态开始。


九、总结

TaskMeta 的设计可以归纳为一句话:用 ResourcePool 管理生命周期,用 Not Reset/Reset 分类字段,用 version_butex 实现 join,用 current_waiter 支持 butex 阻塞唤醒

四个关键设计:

1. Not Reset / Reset 字段分类。 构造函数只初始化基础设施(版本号、锁、等待者),业务数据在每次 bthread_start_* 时重置。这种分类避免了复用时的状态污染,同时减少了初始化开销。

2. version_butex 实现 join。 用一个独立分配的 butex 作为版本号计数器。bthread 结束时递增版本并唤醒等待者,join 方通过 butex_wait 阻塞等待版本变化。比条件变量更轻量,比忙等更高效。

3. current_waiter 连接 butex 机制。 每个TaskMeta 持有当前的 ButexWaiter 指针,使得 bthread_interrupt 等外部操作能定位并唤醒阻塞中的 bthread。这是 butex 等待/唤醒机制(本系列第四篇)与 TaskMeta 的连接点。

4. local_storage + tls_bls 的双存储设计。 TaskMeta 中的 local_storage 是 bthread TLS 的"持久存储",tls_bls 是"快速访问入口"。上下文切换时在两者之间同步——运行时访问 tls_bls__thread 变量,快),切换时保存到 local_storage(结构体成员,持久)。


本文基于 Apache brpc 源码(src/bthread/task_meta.h)撰写。



点个关注和收藏,后面持续更新中!!!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-13 00:45:46 HTTP/2.0 GET : https://67808.cn/a/487968.html
  2. 运行时间 : 0.127505s [ 吞吐率:7.84req/s ] 内存消耗:4,510.75kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=89e68639d2135dbdc684a935121e9a76
  1. /yingpanguazai/ssd/ssd1/www/no.67808.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/no.67808.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/no.67808.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/no.67808.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/no.67808.cn/runtime/temp/6df755f970a38e704c5414acbc6e8bcd.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/no.67808.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000417s ] mysql:host=127.0.0.1;port=3306;dbname=no_67808;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000600s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.008277s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000279s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000558s ]
  6. SELECT * FROM `set` [ RunTime:0.003235s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000592s ]
  8. SELECT * FROM `article` WHERE `id` = 487968 LIMIT 1 [ RunTime:0.003822s ]
  9. UPDATE `article` SET `lasttime` = 1778604347 WHERE `id` = 487968 [ RunTime:0.004947s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000276s ]
  11. SELECT * FROM `article` WHERE `id` < 487968 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002384s ]
  12. SELECT * FROM `article` WHERE `id` > 487968 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000617s ]
  13. SELECT * FROM `article` WHERE `id` < 487968 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002299s ]
  14. SELECT * FROM `article` WHERE `id` < 487968 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.007772s ]
  15. SELECT * FROM `article` WHERE `id` < 487968 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001510s ]
0.129130s