乐于分享
好东西不私藏

Netty源码分析(9) NioEventLoop 的 run() 方法到底在干什么?

Netty源码分析(9) NioEventLoop 的 run() 方法到底在干什么?

Netty源码分析(9) — NioEventLoop 的 run() 方法到底在干什么?

大家好,这里是 Netty 源码分析系列的第 9 篇。

前面我们讲了 EventLoopGroup 的结构、Channel 的注册流程。今天,我们把目光聚焦到最核心的地方——NioEventLoop 的 run() 方法

为什么要深入这一行代码?因为:

NioEventLoop.run() 就是 Netty 的"主循环"——所有网络事件的接收、分发、处理,全在这里。

可以这么说,整个 Netty 服务端在运行时,绝大多数 CPU 时间都花在一个个 NioEventLoop 线程的 run() 方法里。搞懂它,就搞懂了 Netty 的运行时。


一、run() 的全貌

先不急着看源码,想想你期望一个网络事件循环应该是什么样的?

while (服务器没关闭) {
    1. 检查有没有 IO 事件(OP_ACCEPT, OP_READ 等)
    2. 有 → 处理
    3. 处理非 IO 任务(定时任务、用户提交的任务)
    4. 回到 1
}

而 Netty 的 NioEventLoop.run() 做的就是这个事,但它做了很多性能优化防坑处理。我们直接看源码:

@Override
protected void run() {
    int selectCnt = 0;  // 记录 select 次数,用于检测空轮询 BUG
    for (;;) {
        try {
            int strategy;
            try {
                // ★ 关键:根据是否有任务来决定 select 策略
                strategy = selectStrategy.calculateStrategy(selectStrategy, 
                                                            hasTasks() || hasScheduledTasks());
                switch (strategy) {
                case SelectStrategy.CONTINUE:  // 外部要求重试
                    continue;
                case SelectStrategy.BUSY_WAIT: // 繁忙等待(非 NIO 支持)
                    strategy = selectCnt;
                    break;
                case SelectStrategy.SELECT:    // 没有任务→阻塞 select
                    strategy = select(curDeadlineNanos);
                    break;
                default:
                    // other cases
                }
            } catch (IOException e) {
                rebuildSelector0();
                selectCnt = 0;
                handleLoopException(e);
                continue;
            }

            selectCnt++;  // 完成一次 select
            cancelledKeys = canceller.run();  // 处理取消的 key
            needsToSelectAgain = false;

            // ★ IO 事件处理与任务执行的比例控制
            final int ioRatio = this.ioRatio;
            boolean ranTasks;
            if (ioRatio == 100) {
                try {
                    if (strategy > 0) {
                        processSelectedKeys();  // 处理 IO 事件
                    }
                } finally {
                    ranTasks = runAllTasks();   // 处理所有非 IO 任务
                }
            } else if (strategy > 0) {
                final long ioStartTime = System.nanoTime();
                try {
                    processSelectedKeys();  // 处理 IO 事件
                } finally {
                    final long ioTime = System.nanoTime() - ioStartTime;
                    // 按 ioRatio 控制任务执行时间
                    ranTasks = runAllTasks(ioTime * (100 - ioRatio) / ioRatio);
                }
            } else {
                ranTasks = runAllTasks(0);  // 没有 IO 事件,只跑任务
            }

            // ★ 空轮询 BUG 检测
            if (ranTasks || strategy > 0) {
                selectCnt = 1;  // 有实际工作,重置计数
            } else if (selectCnt > SELECTOR_AUTO_REBUILD_THRESHOLD) {
                // 连续 SELECTOR_AUTO_REBUILD_THRESHOLD(512) 次 select 返回 0
                // 判定为 JDK 空轮询 BUG,重建 Selector
                rebuildSelector();
                selectCnt = 0;
                handleLoopException(new IOException("..."));
                break;
            }

            // 处理优雅关闭
            if (isShuttingDown()) {
                closeAll();
                if (confirmShutdown()) {
                    break;
                }
            }
        } catch (CancelledKeyException e) {
            // JDK 的已知 BUG,吞掉继续
        } catch (Error e) {
            throw e;
        } catch (Throwable t) {
            handleLoopException(t);
        }
    }
}

猛一看代码量不小,但核心就三层:

  1. select 策略 — 决定用阻塞还是非阻塞的方式等事件
  2. IO 比例控制 — 处理 IO 事件和任务的时间分配
  3. 空轮询检测 — 对抗 JDK 著名的 epoll bug

下面一层层拆。


二、SelectStrategy:阻塞还是不阻塞?

strategy = selectStrategy.calculateStrategy(selectStrategy, 
                                            hasTasks() || hasScheduledTasks());

这段代码在问一个问题:当前有没有待执行的非 IO 任务?

  • 如果有待执行任务 → selectStrategy 返回 SelectStrategy.SELECT → 阻塞 select(最多等一个 timeout)
  • 如果没有任务 → selectStrategy 直接返回 selectCnt → 不做 select 操作

等等,这里有一个反直觉的地方:有任务的时候反而走阻塞 select?

其实逻辑是这样的:

calculateStrategy(selectNowSupplier, hasTasks) {
    if (hasTasks) {
        // 有任务要执行→非阻塞 select,立即返回然后去跑任务
        return selectNowSupplier.get();  // 调 Selector.selectNow()
    } else {
        // 没有任务→可以安心地阻塞 select 等事件
        return SELECT;
    }
}

这里的逻辑非常简单:

  • 有任务跑:用 selectNow() 非阻塞扫一遍 IO 事件,然后赶紧去处理任务
  • 没任务跑:用 select(timeout) 阻塞等,减少 CPU 空转

这个策略的核心思想是:IO 事件不需要立刻处理,但用户提交的任务应该尽快执行。 因为用户任务可能包含 close()write() 这类对及时性敏感的操作。


三、ioRatio:IO 吃 CPU 还是任务吃 CPU?

Netty 有一个默认 50% 的 IO 比例控制:

final int ioRatio = this.ioRatio;  // 默认 50

这个值的意思是:在一个循环周期内,IO 事件处理时间不允许超过任务执行时间。

具体算法:

  • 先记录处理 IO 事件花了多长时间(ioTime
  • 任务执行时间的上限 = ioTime * (100 - ioRatio) / ioRatio
  • 如果 ioRatio = 50,任务执行时间上限 = ioTime * 50 / 50 = ioTime(与 IO 时间相同)
  • 如果 ioRatio = 70,任务执行时间上限 ≈ ioTime * 30 / 70 ≈ 0.43 * ioTime
  • 如果 ioRatio = 100不限制任务时间,所有任务跑完为止
if (ioRatio == 100) {
    // ioRatio=100: IO 和任务谁都不让谁
    runAllTasks();  // 跑完所有任务
else {
    // ioRatio<100: 按比例分配
    runAllTasks(ioTime * (100 - ioRatio) / ioRatio);
}

这意味着:

  • 如果某个 NioEventLoop 上堆积了大量用户任务(比如定时器任务、业务逻辑回调),IO 可能得不到及时处理
  • 如果 ioRatio 设置太低,网络吞吐会受影响
  • ioRatio=100 是最高吞吐,但可能导致任务饿死

实际建议:

场景 推荐 ioRatio 原因
纯网络代理、网关 100 任务少,追求 IO 吞吐
业务逻辑密集的服务 50~70 给任务执行留时间
不确定 默认 50 安全平衡

四、JDK 空轮询 BUG:Netty 是怎么把自己救活的?

这是一段经典代码:

if (ranTasks || strategy > 0) {
    selectCnt = 1;
else if (selectCnt > SELECTOR_AUTO_REBUILD_THRESHOLD) {
    rebuildSelector();
    selectCnt = 0;
    handleLoopException(new IOException("..."));
    break;
}

如果你不知道这个历史,可能会觉得这代码莫名其妙:为什么连续 512 次 select 返回 0 就要重建 Selector?

背景故事

JDK 的 epoll 实现有一个著名的 BUG(JDK-2144974,通称 epoll CPU 100% 问题):

在某些情况下,Selector.select(timeout) 会立即返回 0,即使没有任何事件发生。而且会一直重复,导致 CPU 空转 100%。

这个问题在 JDK 8 的一些版本中仍然存在,尤其在高并发 + Linux 环境下更容易触发。

Netty 的自救方案

Netty 的做法是"非侵入式的自愈":

  1. 连续 select() 返回 0 的次数超过 512 次(SELECTOR_AUTO_REBUILD_THRESHOLD
  2. 判定命中了 JDK 的空轮询 BUG
  3. 重建一个 Selector:把旧 Selector 上所有注册的 Channel 迁移到新 Selector
  4. 继续工作,对上层完全透明

重建 Selector 的核心逻辑在 rebuildSelector() 中:

private void rebuildSelector0() {
    final Selector oldSelector = selector;
    final Selector newSelector;
    
    // 1. 创建一个新的 Selector
    newSelector = openSelector();
    
    // 2. 迁移所有 Channel 的注册
    int nChannels = 0;
    for (SelectionKey key : oldSelector.keys()) {
        Object a = key.attachment();
        try {
            if (!key.isValid() || key.channel().keyFor(newSelector) != null) {
                continue;
            }
            int interestOps = key.interestOps();
            key.cancel();
            // 在新 Selector 上重新注册
            SelectionKey newKey = key.channel().register(newSelector, interestOps, a);
            nChannels++;
        } catch (Exception e) {
            // ...
        }
    }
    
    // 3. 替换
    selector = newSelector;
    
    // 4. 关闭旧的 Selector
    oldSelector.close();
}

这个过程对上层业务完全无感——Channel 还在,Handler 还在,只是底层 Selector 换了一个。

一个有趣的细节

Netty 在 NioEventLoop 启动时,强制把 Selector 的 wakeup 方法改了

// SelectedSelectionKeySetSelector 包装
// 目的是让 Selector 使用 Netty 自己优化的 SelectedKeys 集合

这是因为 JDK 默认的 SelectedKeys 是 HashSet,而 Netty 用数组实现的 SelectedSelectionKeySet 替换了它,减少了 GC 压力和遍历开销。这块后面有机会再展开。


五、完整流程图

NioEventLoop.run()
      │
      ▼
┌─────────────┐
│ 计算策略     │
│ hasTasks?    │
│  ┌───┐      │
│  │是 │→selectNow()→非阻塞
│  │否 │→select(timeout)→阻塞
│  └───┘      │
└──────┬──────┘
       ▼
┌──────────────┐
│ 处理取消的Key│
└──────┬───────┘
       ▼
┌─────────────────────┐
│  处理 IO 事件        │
│  processSelectedKeys │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│  执行任务            │
│  runAllTasks(timeout)│
└──────────┬──────────┘
           ▼
┌─────────────────────────┐
│  空轮询检测              │
│  selectCnt > 512?       │
│  ┌───┐                  │
│  │是 │ → rebuildSelector│
│  │否 │ → 继续循环        │
│  └───┘                  │
└──────────┬──────────────┘
           ▼
     回到循环开始

六、面试题精选

Q:NioEventLoop.run() 是如何避免 CPU 空转的?

A:通过两个机制:

  1. SelectStrategy:有任务时用 selectNow() 非阻塞快速返回,没任务时用 select(timeout) 阻塞等待
  2. ioRatio 控制:IO 处理时间和任务执行时间按比例分配,避免某一方占满 CPU

Q:Netty 为什么能自愈 JDK 空轮询 BUG?

A:Netty 在每个循环周期检测连续 select 返回 0 的次数,当超过 512 次(SELECTOR_AUTO_REBUILD_THRESHOLD)时,主动重建一个 Selector,并将所有 Channel 注册迁移到新 Selector 上,同时关闭旧的。这个过程对上层业务完全透明。

Q:ioRatio=100 和 ioRatio=50 有什么区别?

A:ioRatio=100 时不限制任务执行时间,所有任务都会被执行完;ioRatio=50 时任务执行时间不超过 IO 处理时间,防止任务堆积影响网络吞吐。ioRatio=100 吞吐最高但可能导致任务线程饥饿;ioRatio=50 更平衡。


下一期预告:Netty源码分析(10) — 内存分配之 PooledByteBufAllocator,进入 Netty 引以为傲的池化内存管理世界。

我们明晚见!

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-12 07:04:36 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/739703.html
  2. 运行时间 : 0.154278s [ 吞吐率:6.48req/s ] 内存消耗:4,751.03kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=ced4180b725d51b5d652fbae47fc15c1
  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.000877s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001431s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000787s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000647s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001413s ]
  6. SELECT * FROM `set` [ RunTime:0.000535s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001498s ]
  8. SELECT * FROM `article` WHERE `id` = 739703 LIMIT 1 [ RunTime:0.001310s ]
  9. UPDATE `article` SET `lasttime` = 1781219076 WHERE `id` = 739703 [ RunTime:0.002100s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000775s ]
  11. SELECT * FROM `article` WHERE `id` < 739703 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001211s ]
  12. SELECT * FROM `article` WHERE `id` > 739703 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001105s ]
  13. SELECT * FROM `article` WHERE `id` < 739703 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004240s ]
  14. SELECT * FROM `article` WHERE `id` < 739703 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.010897s ]
  15. SELECT * FROM `article` WHERE `id` < 739703 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004195s ]
0.155999s