当前位置:首页>学习笔记>brpc 学习笔记(三):ResourcePool——带 ID 索引的对象池

brpc 学习笔记(三):ResourcePool——带 ID 索引的对象池

  • 2026-04-30 06:59:01
brpc 学习笔记(三):ResourcePool——带 ID 索引的对象池

在上一篇文章中,我们拆解了 ObjectPool 的三层无锁分配设计。它用 TLS 让每个线程独享 Block 和 FreeChunk,将对象分配和归还的锁竞争降到最低。

但 ObjectPool 有一个局限:对象只能通过指针访问。归还后,对象被缓存复用,外部不再持有引用。如果需要一种轻量级的全局标识——比如用一个整数而非指针来跨模块、跨线程、甚至跨网络引用一个对象——ObjectPool 就无能为力了。

brpc 的 butil::ResourcePool 正是为这种场景设计的。它在 ObjectPool 的架构基础上增加了 ResourceId 机制,每个对象拥有全局唯一的 64 位 ID,任何时候都可通过 ID 在 O(1) 时间内定位到对象地址。

本文从源码出发,拆解 ResourcePool 的设计,重点分析它与 ObjectPool 的异同。


一、ResourcePool 是什么?

ResourcePool 与 ObjectPool 的架构几乎相同——同样采用 LocalPool(线程本地)+ BlockGroup(全局索引)+ FreeChunk(空闲列表)的三层结构,同样通过 TLS 实现无锁分配。

核心区别只有一个:ResourcePool 为每个对象分配全局唯一的 ResourceId

这意味着:

  • 获取资源时,同时返回对象指针和 ResourceId
  • 归还资源时,只需归还 ResourceId
  • 任何时候都可通过 ResourceId 在 O(1) 内定位对象

二、ResourceId:64 位编码

template <typename T>struct ResourceId {    uint64_t value;  // 全局唯一标识符};
ResourceId 的 value 编码了对象在三级索引中的位置:
value = block_index × BLOCK_NITEM + offset_in_block

其中:

  • block_index
    :Block 在全局中的序号(通过二级索引进一步分解)
  • offset_in_block
    :对象在 Block 内的偏移

解码过程:

block_index     = value / BLOCK_NITEMgroup_index     = block_index >> 16         // 高位 → BlockGroup 编号block_in_group  = block_index & 0xFFFF      // 低位 → BlockGroup 内的槽位offset          = value - block_index × BLOCK_NITEM

这种编码让 ID 既紧凑(仅 8 字节)又高效——解码只需几次位运算和除法。

ResourceId 还提供了类型安全的转换:

template <typename T2>ResourceId<T2> cast()const{    ResourceId<T2> id = { value };    return id;}
用于不同类型资源池之间的 ID 传递(值不变,仅类型包装改变)。

三、整体架构

与 ObjectPool 相同的三层结构:

ResourcePool<T>(全局单例)  ├─ LocalPool(线程本地,每线程一个)  │    ├─ _cur_block     ← 当前 Block(线程独占,无锁分配)  │    └─ _cur_free      ← 本地 FreeChunk(存储 ResourceId,而非 T*)  ├─ BlockGroup[](全局 Block 索引)  │    └─ Block*[](每个 BlockGroup 管理 65536 个 Block)  └─ _free_chunks(全局空闲列表,存储 ResourceId)
Block、BlockGroup、LocalPool 的定义与 ObjectPool 几乎完全一致(BlockItem 对齐存储、Block 缓存行对齐、BlockGroup 二级索引、LocalPool TLS 线程本地等),此处不再赘述。下面重点分析与 ObjectPool 不同的部分。

四、FreeChunk:存储 ID 而非指针

template <typename T, size_t NITEM>struct ResourcePoolFreeChunk {    size_t nfree;                // 当前空闲 ID 数量    ResourceId<T> ids[NITEM];   // 空闲资源 ID 数组(注意:是 ID,不是指针)};

与 ObjectPool 的 FreeChunk 对比:

ObjectPool FreeChunk
ResourcePool FreeChunk
存储内容
T* ptrs[]
(对象指针)
ResourceId<T> ids[]
(资源 ID)
归还单位
指针
ID
寻址方式
直接通过指针访问
通过 ID 定位对象

为什么用 ID 而非指针?因为 ID 是稳定的——对象在 Block 中的位置从不改变(Block 创建后不移动),ID 编码了位置信息。即使对象被归还再重新分配,同一个 ID 始终指向同一块内存。

同样有 DynamicFreeChunk 变体(柔性数组),用于全局空闲列表中变长的 FreeChunk 存储。


五、获取资源:get_resource

与 ObjectPool 的 get() 类似的四级优先级,但每个分支都需要同时处理 ID:

1. 本地 FreeChunk ──→ 2. 全局 FreeChunk ──→ 3. 本地 Block ──→ 4. 新建 Block   (无锁)              (加锁)              (无锁)          (原子操作)

第一级:本地 FreeChunk(最快,无锁)

if (_cur_free.nfree) {    const ResourceId<T> free_id = _cur_free.ids[--_cur_free.nfree];    *id = free_id;                                  // 输出 ID    return unsafe_address_resource(free_id);        // 通过 ID 定位对象}
注意这里与 ObjectPool 的区别:ObjectPool 直接返回 ptrs[] 中的指针,而 ResourcePool 取出的是 ID,需要通过 unsafe_address_resource 转换为指针。
第二级:全局 FreeChunk
if (_pool->pop_free_chunk(_cur_free)) {    --_cur_free.nfree;    const ResourceId<T> free_id = _cur_free.ids[_cur_free.nfree];    *id = free_id;    return unsafe_address_resource(free_id);}
同样是从全局列表拉取一批 ID,而非指针。
第三级:本地 Block(placement new,生成新 ID)
if (_cur_block && _cur_block->nitem < BLOCK_NITEM) {    // 计算新对象的 ID    id->value = _cur_block_index * BLOCK_NITEM + _cur_block->nitem;    auto item = _cur_block->items + _cur_block->nitem;    p = new (item->void_data()) T;    if (!ResourcePoolValidator<T>::validate(p)) {        p->~T();        return NULL;    }    ++_cur_block->nitem;    return p;}

这是与 ObjectPool 的关键差异之一:从 Block 分配新对象时,需要计算并生成新的 ResourceId。ID 的值由 Block 的全局索引和对象在 Block 内的偏移共同决定。

此外,ResourcePool 增加了 ResourcePoolValidator 验证步骤——构造后检查对象是否有效(如构造函数内部 ENOMEM 失败),无效则立即析构并返回 NULL。ObjectPool 没有这个机制。

第四级:新建 Block

当前 Block 已满时,调用 add_block 创建新 Block,再从中分配第一个对象并生成 ID。


六、归还资源:return_resource

归还资源  ├─ 本地 FreeChunk 未满 → 直接放入 ID(无锁)  └─ 本地 FreeChunk 已满 → 整批推送全局 → 放入清空后的本地 FreeChunk
inline int return_resource(ResourceId<T> id) {    // 优先放回本地 FreeChunk(无锁,最快路径)    if (_cur_free.nfree < ResourcePool::free_chunk_nitem()) {        _cur_free.ids[_cur_free.nfree++] = id;   // 存储 ID,而非指针        return 0;    }    // 本地已满,推送到全局    if (_pool->push_free_chunk(_cur_free)) {        _cur_free.nfree = 1;        _cur_free.ids[0] = id;        return 0;    }    return -1;}

与 ObjectPool 的 return_object() 流程一致,区别仅在于存储的是 ID 而非指针。归还 ID 意味着调用者不需要持有对象指针——只需持有 8 字节的 ID,后续需要时再通过 address_resource 获取指针。


七、address_resource:O(1) 定位对象

这是 ResourcePool 的核心能力——通过 ID 在 O(1) 时间内定位对象。有两个版本:

7.1 unsafe_address_resource(无安全检查,快速路径)

staticinline T* unsafe_address_resource(ResourceId<T> id){    const size_t block_index = id.value / BLOCK_NITEM;    return (T*)(_block_groups[(block_index >> RP_GROUP_NBLOCK_NBIT)]                .load(butil::memory_order_consume)                ->blocks[(block_index & (RP_GROUP_NBLOCK - 1))]                .load(butil::memory_order_consume)->items) +           id.value - block_index * BLOCK_NITEM;}

整个过程:一次除法 + 两次位运算 + 三次数组索引 + 一次指针加法,全部 O(1),无任何分支判断。

解码链路:

ResourceId.value    │    ├─ block_index = value / BLOCK_NITEM    │      │    │      ├─ group_index = block_index >> 16    │      │      └─ _block_groups[group_index] → BlockGroup*    │      │    │      └─ block_in_group = block_index & 0xFFFF    │             └─ BlockGroup->blocks[block_in_group] → Block*    │    └─ offset = value - block_index × BLOCK_NITEM           └─ Block->items + offset → T*

7.2 address_resource(带边界检查)

staticinline T* address_resource(ResourceId<T> id){    const size_t block_index = id.value / BLOCK_NITEM;    const size_t group_index = (block_index >> RP_GROUP_NBLOCK_NBIT);    if (__builtin_expect(group_index < RP_MAX_BLOCK_NGROUP, 1)) {        BlockGroup* bg = _block_groups[group_index].load(butil::memory_order_consume);        if (__builtin_expect(bg != NULL1)) {            Block* b = bg->blocks[block_index & (RP_GROUP_NBLOCK - 1)]                       .load(butil::memory_order_consume);            if (__builtin_expect(b != NULL1)) {                const size_t offset = id.value - block_index * BLOCK_NITEM;                if (__builtin_expect(offset < b->nitem, 1)) {                    return (T*)b->items + offset;                }            }        }    }    return NULL;  // ID 无效}

依次验证 group_index → BlockGroup → Block → offset 的有效性。四处 __builtin_expect 标记正常路径,让 CPU 分支预测更准确。返回 NULL 表示 ID 无效(未分配或超出范围)。

注意:已归还(空闲)的 ID 仍然返回非 NULL——因为 Block 和其中的对象内存仍然存在,只是该 ID 被标记为可复用。


八、与 ObjectPool 的异同对比

相同点

方面
说明
三层架构
LocalPool + BlockGroup + 全局 FreeChunk
无锁分配
TLS + 本地 Block,分配路径无锁
批量搬运
FreeChunk 批量推送/弹出,摊销锁开销
内存预分配
Block 创建时一次性分配所有槽位
缓存行对齐
Block、LocalPool 均 64 字节对齐
线程管理
thread_atexit 自动清理,最后一个线程可回收全局资源
双检锁单例
全局 ObjectPool/ResourcePool 实例通过双检锁创建
添加 Block
fetch_add 原子预占位 + BlockGroup 扩容

不同点

方面
ObjectPool
ResourcePool
标识方式
指针(T*
64 位 ID(ResourceId<T>
FreeChunk 存储
T*
 指针数组
ResourceId<T>
 ID 数组
归还单位
T*
 指针
ResourceId<T>
 ID
O(1) 寻址
不支持,只能通过指针
address_resource
 通过 ID 定位
获取接口
返回 T*
返回 T* + 输出参数 ResourceId<T>*
对象验证
ResourcePoolValidator
(构造后验证)
典型用途
通用对象池
需要全局标识的场景

什么时候用哪个?

  • ObjectPool
    :只需要分配和归还对象,通过指针直接访问。适用于 RPC Context、临时对象等短生命周期场景。
  • ResourcePool
    :需要全局唯一标识符,或需要跨模块/跨线程以轻量级方式引用对象的场景。典型如 bthread 的 TaskMeta——调度器通过 bthread ID 在 O(1) 时间内定位到对应的 TaskMeta 结构。

九、总结

ResourcePool 的设计可以归纳为一句话:在 ObjectPool 的无锁分配基础上,增加了 ID 索引机制,实现了 O(1) 的 ID→对象寻址

三个关键设计:

1. 紧凑的 ID 编码。 ResourceId 仅 8 字节,编码了 group_index + block_in_group + offset 三级位置信息。传递 ID 比传递指针更轻量,且不受对象生命周期影响——ID 始终指向固定的内存位置。

2. O(1) 寻址。 通过二级索引(BlockGroup → Block → offset),几次位运算和数组索引即可从 ID 定位到对象。快速路径(unsafe_address_resource)无任何分支判断,适合热路径调用。

3. 与 ObjectPool 共享架构,最小化新代码。 LocalPool、Block、BlockGroup 的设计完全复用 ObjectPool 的模式,仅在需要处理 ID 的地方做调整——FreeChunk 存 ID 而非指针、get 时计算并输出 ID、return 时归还 ID。这意味着 ObjectPool 的全部性能优势(无锁分配、批量搬运、零碎片)同样适用于 ResourcePool。

这套设计让 brpc 在需要全局标识的场景下(如 bthread 调度),既能享受对象池的性能,又能通过 ID 高效索引——这是 brpc 高并发能力的又一个基石。


本文基于 Apache brpc 源码(src/butil/resource_pool.hsrc/butil/resource_pool_inl.h)撰写。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-01 00:21:56 HTTP/2.0 GET : https://67808.cn/a/485044.html
  2. 运行时间 : 0.148668s [ 吞吐率:6.73req/s ] 内存消耗:4,468.42kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=e542eef0237fe589bb3982086aa9f364
  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.000681s ] mysql:host=127.0.0.1;port=3306;dbname=no_67808;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000955s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000352s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.006169s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000963s ]
  6. SELECT * FROM `set` [ RunTime:0.000279s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000757s ]
  8. SELECT * FROM `article` WHERE `id` = 485044 LIMIT 1 [ RunTime:0.045695s ]
  9. UPDATE `article` SET `lasttime` = 1777566116 WHERE `id` = 485044 [ RunTime:0.007398s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000386s ]
  11. SELECT * FROM `article` WHERE `id` < 485044 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000572s ]
  12. SELECT * FROM `article` WHERE `id` > 485044 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000471s ]
  13. SELECT * FROM `article` WHERE `id` < 485044 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000842s ]
  14. SELECT * FROM `article` WHERE `id` < 485044 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001226s ]
  15. SELECT * FROM `article` WHERE `id` < 485044 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001415s ]
0.150344s