乐于分享
好东西不私藏

NioEventLoop 源码:一个线程如何同时处理 I/O 和任务(源码系列第4篇)

NioEventLoop 源码:一个线程如何同时处理 I/O 和任务(源码系列第4篇)

NioEventLoop 不是只会调用 Selector.select() 的 I/O 线程,而是一个带任务队列、定时调度、唤醒协议和时间预算的单线程执行器。Netty 的低锁与有序性来自“Channel 固定绑定 EventLoop”,而吞吐抖动往往来自 I/O、普通任务和定时任务对同一条线程的竞争。

Netty 最常见的描述是“基于 Reactor 模型,一个线程可以处理很多连接”。这句话没有错,但只解释了 Selector 复用,没有解释 Netty 为什么还要让业务通过 eventLoop().execute() 提交任务,也没有解释心跳、Promise Listener、跨线程 write 为什么最终都能回到同一连接线程。

答案在 NioEventLoop.run():它每轮循环都要在三类工作之间做协调。

  1. 1. 等待或轮询 I/O 就绪事件。
  2. 2. 处理 SelectionKey 对应的 Channel 操作。
  3. 3. 运行普通任务和到期的定时任务。

因此 EventLoop 卡顿不一定是 Selector 慢,也可能是任务队列太长;定时任务延迟不一定是调度器有 Bug,也可能是某次 I/O 回调执行太久。把它当成一个“单线程小型操作系统”比把它叫作“线程池里的线程”更接近真实。

源码基线:

  • • Netty netty-4.1.135.Final
  • • Commit:f05f765d81460799c53123a207f665bf3b465171
  • • 文件:transport/src/main/java/io/netty/channel/nio/NioEventLoop.java
  • • 方法:run()processSelectedKeys()select(...)
  • • 链接:https://github.com/netty/netty/blob/netty-4.1.135.Final/transport/src/main/java/io/netty/channel/nio/NioEventLoop.java

这张流程图可以按一个循环理解:先决定是否阻塞在 Selector,再处理就绪 SelectionKey,最后按 ioRatio 给普通任务和定时任务分配时间。它说明 EventLoop 不是“只做网络 I/O 的线程”,而是 I/O、用户任务、Promise 回调、定时任务共享的单线程调度器;任何一个环节阻塞,都会影响同一 EventLoop 上的全部 Channel。

1. EventLoop 同时实现执行器和事件循环

从类型体系看,EventLoop 继承 EventExecutor,又继承 EventLoopGroup。它既能注册 Channel,也能执行 Runnable、调度定时任务和返回 Future。

这不是接口堆叠,而是统一并发模型的关键。任何影响某条 Channel 的状态变更,只要提交到它的 EventLoop,就会与该 Channel 的 I/O 回调串行执行:

channel.eventLoop().execute(() -> {    // 与该 Channel 的 channelRead/write/close 等事件串行    updateConnectionState();});

如果当前就在 EventLoop 线程,许多操作可以直接执行;如果在外部业务线程,Netty 会把操作封装成任务放入队列,并唤醒可能阻塞在 select 的 EventLoop。

这种“线程封闭”降低了锁需求,但边界只在单个 EventLoop 内成立。一个可共享 Handler 被多个 Channel 使用,而这些 Channel 可能属于不同 EventLoop,此时 Handler 自己的共享状态仍然需要线程安全。

2. run 循环的骨架是无限循环加异常恢复

NioEventLoop.run() 外层是一个长期循环。简化结构如下:

protected void run() {    int selectCnt = 0;    for (;;) {        try {            int strategy = selectStrategy.calculateStrategy(selectNowSupplier, hasTasks());            switch (strategy) {                case SelectStrategy.CONTINUE:                    continue;                case SelectStrategy.BUSY_WAIT:                case SelectStrategy.SELECT:                    long curDeadlineNanos = nextScheduledTaskDeadlineNanos();                    strategy = select(curDeadlineNanos);                    break;                default:            }            selectCnt++;            cancelledKeys = 0;            needsToSelectAgain = false;            final int ioRatio = this.ioRatio;            boolean ranTasks;            if (ioRatio == 100) {                try {                    if (strategy > 0) {                        processSelectedKeys();                    }                } finally {                    ranTasks = runAllTasks();                }            } else {                long ioStartTime = System.nanoTime();                try {                    if (strategy > 0) {                        processSelectedKeys();                    }                } finally {                    long ioTime = System.nanoTime() - ioStartTime;                    ranTasks = runAllTasks(ioTime * (100 - ioRatio) / ioRatio);                }            }        } catch (Throwable t) {            handleLoopException(t);        } finally {            // shutdown 确认与资源清理        }    }}

这段骨架体现四个设计目标:

  • • 没有任务时阻塞 select,避免空转浪费 CPU。
  • • 有任务时减少阻塞,及时处理任务。
  • • I/O 与任务之间按时间预算平衡。
  • • 单次异常不能让 EventLoop 线程退出。

EventLoop 是大量连接的共享基础设施。如果某个 Channel 回调异常就让 run 循环结束,整个线程管理的连接都会失去响应。因此最外层必须捕获 Throwable,记录并继续下一轮。具体 Channel 异常仍会沿 Pipeline 传播并按连接维度处理。

3. SelectStrategy 决定阻塞、非阻塞还是继续循环

直接每轮调用 selector.select() 会产生一个问题:任务队列已经有任务时,EventLoop 仍可能睡在 Selector 里。直接每轮 selectNow() 又会导致空闲时 CPU 空转。

SelectStrategy 在二者之间做决策。默认策略会根据 hasTasks() 决定先执行非阻塞 select,还是进入可能阻塞的 SELECT 分支。

典型语义是:

  • • CONTINUE:不做 select,继续下一轮。
  • • SELECT:根据最近定时任务期限计算阻塞时间。
  • • 非负整数:表示 selectNow() 得到的就绪 Key 数。

定时任务期限也会参与 select 超时计算。假设最近心跳任务 100ms 后到期,Selector 就不能无限期阻塞,而应最多睡到该期限。这样 Netty 不需要单独的定时线程唤醒 EventLoop。

4. wakeup 解决跨线程任务与阻塞 select 的竞态

外部线程调用 eventLoop.execute(task) 时,EventLoop 可能正在:

  1. 1. 处理 I/O。
  2. 2. 运行任务。
  3. 3. 阻塞在 selector.select()

前两种情况下任务稍后自然会被取出。第三种情况下,如果不唤醒 Selector,任务可能一直等到网络事件或 select 超时。

因此任务入队后,必要时调用 selector.wakeup()。但 wakeup 不是越多越好,它是系统调用并可能制造额外循环。Netty 使用原子状态协调“是否正在 select”和“是否已经请求唤醒”,尽量合并重复 wakeup。

这类代码看起来复杂,是因为要处理经典竞态:

EventLoop 检查队列为空外部线程提交任务EventLoop 刚好进入 select

如果提交线程认为 EventLoop 还没 select 而不唤醒,任务会延迟;如果 EventLoop 对每个任务都无条件 wakeup,又会影响吞吐。Netty 的状态位正是在缩小这个窗口。

5. SelectedKey 最终被还原成 Channel 操作

Selector 返回 SelectionKey 后,processSelectedKeys() 遍历就绪集合。Netty会尝试用优化的数组结构替代 JDK 原始 Set,以减少迭代和删除开销;无法注入优化实现时,再走普通 Set。

对 Netty Channel,SelectionKey attachment 是 AbstractNioChannel。处理逻辑根据 readyOps 分派:

int readyOps = k.readyOps();if ((readyOps & SelectionKey.OP_CONNECT) != 0) {    int ops = k.interestOps();    ops &= ~SelectionKey.OP_CONNECT;    k.interestOps(ops);    unsafe.finishConnect();}if ((readyOps & SelectionKey.OP_WRITE) != 0) {    ch.unsafe().forceFlush();}if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0        || readyOps == 0) {    unsafe.read();}

三个分支对应三条重要主链:

  • • OP_ACCEPT/OP_READ:接入连接或读取数据。
  • • OP_WRITE:Socket 曾写不完,现在继续冲刷待发送队列。
  • • OP_CONNECT:客户端非阻塞连接完成。

readyOps == 0 仍尝试 read,是对某些 JDK/平台行为的防御性处理。网络框架不能假定所有 Selector 实现完全理想,很多看似多余的分支都来自长期跨平台实践。

6. ioRatio 分配的是时间,不是事件数量

ioRatio 默认通常为 50。它不是“处理 50 个 I/O 再处理 50 个任务”,而是根据本轮 I/O 花费时间计算任务预算:

long ioTime = System.nanoTime() - ioStartTime;runAllTasks(ioTime * (100 - ioRatio) / ioRatio);

当 ioRatio=50,如果 I/O 处理花了 4ms,任务最多得到大约 4ms。当 ioRatio=80,4ms I/O 对应约 1ms 任务预算。当 ioRatio=100,会处理完所有已选 I/O,再无时间限制地运行当轮任务。

这带来明确取舍:                                                

场景
较高 ioRatio
较低 ioRatio
网络 I/O 很重
提高吞吐
可能推迟读写
跨线程任务很多
任务可能积压
任务响应更及时
定时任务敏感
可能延迟
更容易准时
Handler 全在 EventLoop
业务任务与 I/O 竞争更明显
需结合耗时评估
         调参前必须先知道瓶颈在哪。把 ioRatio 从 50 改到 100,可能提高压测吞吐,也可能让跨线程提交的写任务和定时任务在 I/O 洪峰中饥饿。

7. 任务队列里装的不只是用户 Runnable

EventLoop 的 taskQueue 可能包含:

  • • 用户调用 eventLoop.execute() 提交的任务。
  • • 跨线程 write() 封装的 WriteTask。
  • • Pipeline 动态添加/删除 Handler 的回调。
  • • Promise Listener 的通知任务。
  • • Channel 注册、绑定、关闭等生命周期任务。
  • • 某些延迟到稍后执行的事件。

定时任务则维护在调度结构中,到期后会被转移或执行。心跳、重连、超时检测都可能依赖它。

因此任务队列积压的影响远比“用户任务执行慢”更广。它会造成 writeAndFlush 延迟、注册延迟、连接关闭延迟、定时器漂移和 Promise 回调迟到。监控 EventLoop 时,应同时关注:

  • • 每轮任务执行时间。
  • • pendingTasks 数量。
  • • scheduled task 延迟。
  • • 单个 Handler 耗时。
  • • Selector 空转和 wakeup 频率。

8. 为什么同一 Channel 上通常不需要加锁

假设业务 Handler 保存一个连接级序号:

private long sequence;@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) {    sequence++;    handle(sequence, msg);}

只要该 Handler 实例不被多条 Channel 共享,且所有修改都发生在当前 Channel 的 EventLoop,这个字段通常不需要锁。因为 channelRead、用户事件、出站回调都会按该 EventLoop 串行执行。

若异步业务线程完成后要更新连接状态,正确方式是回到 EventLoop:

businessPool.submit(() -> {    Result result = query();    ctx.executor().execute(() -> {        connectionState.apply(result);        ctx.writeAndFlush(result);    });});

这样重 CPU 或阻塞操作在业务池完成,连接状态与写操作回到 EventLoop 串行。需要警惕业务线程直接修改 Handler 字段,同时 EventLoop 也在访问,线程封闭就被打破了。

这张时序图说明跨线程操作为什么不会直接改 Channel 状态。外部线程只负责把任务放入队列并在必要时 wakeup,真正的状态修改回到 EventLoop 串行执行。写业务代码时,可以利用这个模型把阻塞计算放到业务线程池,但连接状态、写回响应、关闭连接等动作最好再切回 ctx.executor()

9. Selector 空轮询与自动重建

历史上 JDK NIO 在部分平台和版本中可能出现 Selector 没有事件却立即返回,导致 run 循环高速空转,CPU 接近 100%。Netty 在 select 逻辑中统计异常提前返回次数,超过阈值后重建 Selector,并把旧 Selector 上注册的 Channel 迁移到新 Selector。

这不是正常业务路径,却是生产稳定性的重要兜底。重建过程中需要:

  1. 1. 创建新 Selector。
  2. 2. 遍历旧 Selector 的 SelectionKey。
  3. 3. 取消旧 Key。
  4. 4. 用原 interestOps 和 attachment 注册新 Selector。
  5. 5. 更新每个 Channel 保存的 SelectionKey。
  6. 6. 关闭旧 Selector。

这也说明为什么应用不应绕过 Netty 私自修改底层 SelectionKey。Netty 可能在恢复流程中替换它,外部保存的引用会失效。

10. EventLoop 被阻塞时会出现“成组故障”

假设一个 Worker EventLoop 管理 5000 条连接,其中一条连接的 Handler 执行了 2 秒同步调用。这 2 秒内:

  • • 其他 4999 条连接的读事件不能处理。
  • • 已排队的 write task 不能执行。
  • • OP_WRITE 不能继续冲刷。
  • • 心跳和超时任务不能准时运行。
  • • close 和 Promise Listener 也会延迟。

这就是 Netty 线上故障常呈现“某一批连接一起抖动”的原因。连接按 EventLoop 分组,故障也按 EventLoop 扩散。

诊断时可以抓取线程栈,寻找命名类似 nioEventLoopGroup-x-y 的线程。如果线程停在业务数据库、HTTP 客户端、锁或文件 I/O,而不是 Selector 与 Netty 方法,就说明 EventLoop 被业务阻塞。也可在 Handler 前后记录耗时,超过阈值打印事件类型和 Channel。

11. 业务卸载也可能破坏顺序和背压

把所有 Handler 都扔到独立线程池并非自动正确。pipeline.addLast(executorGroup, handler) 可以让 Handler 在指定 EventExecutorGroup 上运行,但要考虑:

  • • 同一 Channel 的事件是否仍由同一 Executor 串行。
  • • 任务队列是否有界。
  • • 异步结果返回时是否保持消息顺序。
  • • ByteBuf 在跨线程期间是否 retain。
  • • 业务池积压是否能反馈到网络读取。

无界业务队列只是把压力从 EventLoop 转移到堆内存。更完整的方案是有界队列、拒绝策略、关闭 AUTO_READ 或根据业务容量控制 read,并把结果写回 EventLoop。

12. 总结:EventLoop 是 Netty 并发模型的最小单元

理解 NioEventLoop.run() 后,Netty 很多设计会连起来:

  • • Channel 固定注册 EventLoop,所以事件有序。
  • • 外部线程通过任务队列影响 Channel,所以需要 wakeup。
  • • I/O 与任务共享线程,所以需要 ioRatio 和时间预算。
  • • 定时任务参与 select 超时,所以心跳不需要独立线程。
  • • EventLoop 管理多条 Channel,所以阻塞会成组扩散。
  • • Selector 可能异常,所以 Netty提供重建兜底。

下一篇将沿 OP_READ -> unsafe.read() 展开,查看 EventLoop 得到读就绪后,Netty如何选择 ByteBuf 大小、执行读循环、传播 channelRead 与 channelReadComplete,以及 Buffer 的所有权从哪里开始转移。

参考资料

  1. 1. NioEventLoop.java:https://github.com/netty/netty/blob/netty-4.1.135.Final/transport/src/main/java/io/netty/channel/nio/NioEventLoop.java
  2. 2. SingleThreadEventExecutor.java:https://github.com/netty/netty/blob/netty-4.1.135.Final/common/src/main/java/io/netty/util/concurrent/SingleThreadEventExecutor.java
  3. 3. SelectStrategy.java:https://github.com/netty/netty/blob/netty-4.1.135.Final/transport/src/main/java/io/netty/channel/SelectStrategy.java
  4. 4. Netty Thread Model:https://netty.io/wiki/thread-model.html
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-07 10:19:51 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/834174.html
  2. 运行时间 : 0.120300s [ 吞吐率:8.31req/s ] 内存消耗:4,743.62kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0c67e91961f827e2d38454f86a122617
  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 ( 3.94 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 ( 9.87 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.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000588s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000931s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000357s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000267s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000609s ]
  6. SELECT * FROM `set` [ RunTime:0.000239s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000727s ]
  8. SELECT * FROM `article` WHERE `id` = 834174 LIMIT 1 [ RunTime:0.000577s ]
  9. UPDATE `article` SET `lasttime` = 1783390791 WHERE `id` = 834174 [ RunTime:0.028087s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000365s ]
  11. SELECT * FROM `article` WHERE `id` < 834174 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000586s ]
  12. SELECT * FROM `article` WHERE `id` > 834174 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000666s ]
  13. SELECT * FROM `article` WHERE `id` < 834174 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001017s ]
  14. SELECT * FROM `article` WHERE `id` < 834174 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000982s ]
  15. SELECT * FROM `article` WHERE `id` < 834174 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001290s ]
0.122066s