乐于分享
好东西不私藏

Netty 定时任务源码:HashedWheelTimer 为什么能低成本管理海量超时(系列第12篇)

Netty 定时任务源码:HashedWheelTimer 为什么能低成本管理海量超时(系列第12篇)

HashedWheelTimer 的优势不是“定时更精确”,而是用固定刻度、环形桶和剩余轮数,把大量近似超时任务的调度成本摊薄。它适合连接超时、请求超时、重试和心跳检测,却不适合高精度调度,也不应该每个连接创建一个实例。

长连接系统里,真正让定时器变重的往往不是单个任务,而是任务数量:十万连接各有读空闲检测,几十万请求各有超时,失败重试又持续创建新任务。如果每次插入都维护一个严格有序的数据结构,任务增加会不断放大调度成本。

时间轮的取舍很明确:把时间切成离散刻度,允许到期时间存在一个 tick 量级的误差,换取接近常数时间的任务落桶和批量过期。理解这个取舍,才能知道它为什么适合网络超时,又为什么不能代替精密调度器。

源码基线:

  • • 项目:Netty
  • • 版本:netty-4.1.135.Final
  • • Commit:f05f765d81460799c53123a207f665bf3b465171
  • • 重点文件:common/src/main/java/io/netty/util/HashedWheelTimer.java
  • • 重点类与方法:HashedWheelTimernewTimeoutWorker.runtransferTimeoutsToBucketsHashedWheelBucket.expireTimeouts
  • • 官方源码:https://github.com/netty/netty/blob/netty-4.1.135.Final/common/src/main/java/io/netty/util/HashedWheelTimer.java

这张图展示了时间轮的三个核心对象:提交线程只把 HashedWheelTimeout 放进 MPSC 队列,Worker 线程在每个 tick 把任务转移到对应 Bucket,指针走到某个槽位时再检查剩余轮数并执行到期任务。提交和执行没有争抢同一条有序链表,正是低成本的来源。

1. 时间轮优化的是“大量近似超时”,不是单次定时精度

HashedWheelTimer 可以看成钟表:wheel 是表盘,tickDuration 是每格时间,tick 是当前走过的格数。一个任务的截止时间会映射到某个槽位;如果截止时间超过一整轮,再用 remainingRounds 记录还要多转几圈。

假设:

  • • 每格 100ms;
  • • 一共 512 格;
  • • 一圈约 51.2 秒;
  • • 某任务 125 秒后到期。

它会落到一个确定槽位,同时记录还需要经过若干完整轮次。Worker 每次经过该槽时先减少 remainingRounds,归零后才真正执行。任务不需要因为时间很远就占据一棵全局排序树的高层节点。

这也决定了精度边界:任务不会早于 deadline 执行,但可能因为 tick 粒度、Worker 调度延迟或任务本身阻塞而晚执行。若业务要求微秒级或严格准点,时间轮不是合适工具。

维度
时间轮
优先队列定时器
插入思路
计算槽位后落桶
按 deadline 维护堆序
大量任务成本
通常更稳定
插入、删除通常带对数成本
精度
受 tickDuration 限制
可按最早 deadline 等待
适合场景
网络超时、心跳、重试
少量高精度任务
主要风险
误差、桶过密、任务阻塞
堆维护和频繁唤醒成本

2. newTimeout 只入队,真正落桶由 Worker 串行完成

newTimeout 没有直接修改 wheel 中的双向链表。源码主路径可精简为:

public Timeout newTimeout(TimerTask task, long delay, TimeUnit unit) {    long pendingTimeoutsCount = pendingTimeouts.incrementAndGet();    if (maxPendingTimeouts > 0 && pendingTimeoutsCount > maxPendingTimeouts) {        pendingTimeouts.decrementAndGet();        throw new RejectedExecutionException("Number of pending timeouts ...");    }    start();    long deadline = System.nanoTime() + unit.toNanos(delay) - startTime;    HashedWheelTimeout timeout = new HashedWheelTimeout(this, task, deadline);    timeouts.add(timeout);    return timeout;}

这段源码证明了两个设计点。

第一,调用线程负责构造任务并进入无锁队列,避免多个业务线程同时操作 Bucket 链表。第二,maxPendingTimeouts 是容量保护;如果不设上限,业务故障可能以“不断创建超时任务”的方式转化为堆内存压力。

取消任务也采用相似思路:调用方标记取消并进入 cancelledTimeouts 队列,Worker 再统一从 Bucket 移除。所有结构性修改集中在 Worker 线程,降低了锁和竞态复杂度。

3. deadline 通过掩码映射槽位,remainingRounds 表示完整圈数

时间轮长度会被规范成 2 的幂,因此槽位映射可以使用按位与:

long calculated = timeout.deadline / tickDuration;timeout.remainingRounds = (calculated - tick) / wheel.length;long ticks = Math.max(calculated, tick);int stopIndex = (int) (ticks & mask);wheel[stopIndex].addTimeout(timeout);

mask = wheel.length - 1。当长度是 2 的幂时,ticks & mask 等价于取模,但计算更直接。Math.max(calculated, tick) 则处理已迟到的任务:即使 deadline 因排队或线程停顿已经过去,也会放到当前可处理的槽位,而不是落回历史刻度。

需要特别注意,O(1) 是“定位槽位”的复杂度,不代表到期处理永远 O(1)。如果大量任务集中在同一个槽位,Worker 到该 tick 仍要遍历整个 Bucket。业务把百万任务设为同一秒到期,会形成明显的到期尖峰。

4. Worker 每个 tick 只做四件事

Worker.run() 的主循环非常克制:

while (WORKER_STATE_UPDATER.get(HashedWheelTimer.this) == WORKER_STATE_STARTED) {    final long deadline = waitForNextTick();    if (deadline > 0) {        int idx = (int) (tick & mask);        processCancelledTasks();        HashedWheelBucket bucket = wheel[idx];        transferTimeoutsToBuckets();        bucket.expireTimeouts(deadline);        tick++;    }}

可以概括成:等待下一格、处理取消、搬运新增任务、过期当前桶。transferTimeoutsToBuckets 每轮还有搬运上限,避免提交洪峰让 Worker 一直搬任务而无法推进时间。

expireTimeouts 遍历当前桶:

  • • 已取消:移除;
  • • remainingRounds > 0:减一,继续等待下一轮;
  • • deadline 已到:从桶移除并执行;
  • • deadline 未到:说明内部状态异常,源码会报错保护。

任务的 TimerTask.run(timeout) 就在 Worker 线程执行。因此一个慢任务会拖迟同一个 Timer 上的其他超时。这一点和 EventLoop 阻塞非常相似:定时器只负责触发,不是耗时业务线程池。

5. tickDuration 和 wheelSize 决定精度、跨度与扫描形态

参数不能只看“越小越准、越大越能装”。它们共同决定一圈时间:

一圈覆盖时间 = tickDuration × wheelSize

参数影响如下:

调整
收益
代价
减小 tickDuration
超时粒度更细
Worker 唤醒更频繁
增大 tickDuration
唤醒成本更低
到期误差更大,同桶任务更多
增大 wheelSize
一圈覆盖更久,remainingRounds 更少
wheel 数组占用增加
减小 wheelSize
结构更小
长延时任务跨更多轮

网络超时通常允许几十毫秒到数百毫秒误差,远不需要每毫秒唤醒一次。应先确定业务可接受的超时误差,再估算典型延时范围和任务量,最后选择参数。

6. HashedWheelTimer 与 EventLoop.schedule 不是同一个调度器

Netty 里还有 EventLoop.schedule。它来自 AbstractScheduledEventExecutor,内部使用按 deadline 排序的优先队列,并由 EventLoop 自己执行。两者不能混为一谈。

选择
执行线程
数据结构
更适合
ctx.executor().schedule
Channel 所属 EventLoop
定时任务优先队列
与单个 Channel 状态严格串行的少量任务
HashedWheelTimer
独立 Worker
环形 Bucket
跨连接、数量庞大的近似超时

IdleStateHandler 默认使用前者,因为空闲状态和 Channel 事件需要在同一 EventLoop 传播。连接池、客户端请求超时管理器等框架组件可能使用共享时间轮,因为它们面对的是跨 Channel 的大规模超时集合。

不要为了“用了 Netty”就把所有定时任务都改成时间轮。选择标准是任务数量、精度要求和线程归属。

这张状态图强调了 newTimeout 之后任务并未立即进入 Bucket;Worker 搬运后,任务随 tick 多次经过目标槽位,remainingRounds 逐轮减少。取消和到期互斥,最终都要从 Bucket 删除并减少 pending 计数。

7. 一个 Timer 应被共享,而不是绑定每个连接

HashedWheelTimer 的每个实例都会创建一个 Worker 线程和一套 wheel。源码还会对创建过多实例给出资源泄漏警告。正确用法通常是在组件或进程级共享:

public final class TimeoutManager {    private final HashedWheelTimer timer =        new HashedWheelTimer(100, TimeUnit.MILLISECONDS, 512);    public Timeout register(RequestContext request, long timeoutMs) {        return timer.newTimeout(t -> request.tryTimeout(),                                timeoutMs, TimeUnit.MILLISECONDS);    }}

请求提前完成时必须取消对应 Timeout,否则任务仍会留到目标槽位才被清理。取消不是为了阻止已经完成的业务,而是为了尽快减少定时器中的无效对象和到期扫描成本。

同时,tryTimeout() 必须幂等。真实系统里正常响应、超时、连接关闭可能并发竞争,最终只能有一个路径完成请求状态。这和上一篇 Promise 的“一次完成”原则完全一致。

8. 定时任务堆积通常来自业务生命周期不闭环

线上看到 pending timeout 持续增长,不要第一反应就是时间轮泄漏。常见根因包括:

  1. 1. 请求成功后没有取消超时任务;
  2. 2. 重试每次创建新 Timeout,却没有取消前一轮;
  3. 3. 连接断开后批量任务仍引用 Channel 和业务上下文;
  4. 4. Worker 任务阻塞,过期速度低于创建速度;
  5. 5. 同一截止时间任务过多,单个 Bucket 形成尖峰;
  6. 6. maxPendingTimeouts 没有限制,异常流量无限进入。

排查时至少记录:pending 数量、每秒创建/取消/过期数、任务执行耗时、单桶过期批量、超时延迟分布和拒绝次数。仅看“定时器线程 CPU”不足以定位生命周期问题。

9. 超时回调只做状态竞争,耗时动作交给别处

推荐把超时任务写成轻量状态转换:

timer.newTimeout(timeout -> {    if (requestPromise.tryFailure(new TimeoutException())) {        eventLoop.execute(() -> channel.writeAndFlush(timeoutResponse));    }}, timeoutMillis, TimeUnit.MILLISECONDS);

这里有两条线程边界:时间轮 Worker 决定请求是否抢到超时完成权;与 Channel 相关的写和关闭动作回到 EventLoop。不要在 TimerTask 中直接做阻塞 RPC、数据库访问、大对象序列化或批量日志。

如果回调需要取消其他任务,也要避免形成长链递归。时间轮的优势建立在每个过期任务足够轻的前提上;一旦回调变成业务执行器,所有 deadline 都会被前一个慢任务拖延。

10. 停止 Timer 要处理未过期任务

stop() 不等于“等待所有任务执行”。停止后 Worker 会退出,并返回尚未处理的 Timeout 集合。组件关闭时应该明确决定:

  • • 未到期请求是统一失败,还是交给其他实例接管;
  • • 是否还允许新任务提交;
  • • 先停止业务入口,还是先停止 Timer;
  • • 如何释放 Timeout 引用的 Channel、Buffer 和上下文。

正确顺序通常是先停止新流量,完成或失败在途请求,再停止时间轮。直接停 Timer 会让依赖超时回收的请求永久悬挂。

11. 时间轮的工程边界可以归纳为四条

时间轮主链如下:

newTimeout  -> timeouts MPSC queue  -> Worker transferTimeoutsToBuckets  -> deadline / tickDuration  -> stopIndex + remainingRounds  -> waitForNextTick  -> bucket.expireTimeouts  -> TimerTask.run

落地时记住四条:共享实例、限制 pending、回调轻量、状态幂等。时间轮解决的是大量超时任务的调度结构,不会自动解决请求生命周期、慢回调和关闭顺序。

下一篇进入操作系统边界:Epoll 与 KQueue 为什么不只是把 Selector 换了名字,它们如何通过 native Channel、事件数组和平台能力暴露 Linux/BSD 特性,以及什么时候值得为性能和功能承担平台绑定。

参考资料

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