乐于分享
好东西不私藏

Zig 编译器错误去重机制:智能提示的源码( 第84篇 )

Zig 编译器错误去重机制:智能提示的源码( 第84篇 )

大家好,我是Zachel,欢迎来到 Zig 源码学习系列第84篇!

我最近又把 Zig 0.16 编译器源码翻了个底朝天,这次真的被它的错误去重机制狠狠惊艳到了。姐妹们有没有过这种经历:写C++的时候,一个循环里的小错误,编译器直接刷屏几十上百条一模一样的报错,找真正的问题要翻半天屏幕?而 Zig 里,哪怕你触发一百次完全相同的错误,它只会安安静静报一次,末尾轻轻标个出现次数,这个设计真的太温柔了。今天就带大家扒一扒,这个超贴心的智能提示背后,到底藏着什么样的源码实现。


1. 背景/现象引入:被错误刷屏的痛,Zig 帮你终结了

写系统级代码的兄弟姐妹们,肯定都懂被重复错误支配的恐惧:

  • C++ 模板实例化时,同一个错误在几十个实例里重复出现,终端直接被刷屏
  • 循环里的类型不匹配、越界检查,每一次循环迭代都报一条一模一样的错误
  • 增量编译时,改了一行代码,之前已经报过的错误又全部重新吐一遍

这些重复的错误,不仅没有任何信息量,还会把真正关键的新错误淹没在茫茫日志里,找问题的时间比写代码还长。

而 Zig 从编译器设计的根源上解决了这个问题。不管是循环里重复触发的错误、泛型多次实例化的相同报错,还是增量编译里的历史错误,编译器都会精准去重:完全相同的错误只保留一条,同时用一个计数器标记它出现的总次数,既不丢失关键信息,又给了我们最清爽的报错体验。

我第一次看到这个效果的时候,真的惊呆了——原来编译报错还能这么体贴,不用再对着满屏重复的错误行头疼了。


2. 源码深度解析:去重机制的核心,就藏在这两个文件里

Zig 的错误去重机制,核心源码集中在两个文件里,逻辑清晰到让人拍案叫绝:

  • lib/std/zig/ErrorBundle.zig:错误消息的核心数据结构,去重计数的载体
  • src/Compilation.zig:错误添加时的去重判断逻辑,整个机制的核心入口

2.1 核心数据结构:ErrorMessage 里的小秘密

首先我们来看 ErrorBundle.zig 里定义的 ErrorMessage 结构体,这是每一条编译错误的最小存储单元,去重的核心就藏在里面的一个字段里:

/// Trailing:/// * MessageIndex for each notes_len.pub const ErrorMessage = struct {    msg: String, // 错误消息文本的intern索引/// Usually one, but incremented for redundant messages.    count: u32 = 1// 去重计数的核心!    src_loc: SourceLocationIndex = .none, // 错误对应的源码位置索引    notes_len: u32 = 0// 附带的note数量};

姐妹们看到了吗?这个 count 字段就是去重的灵魂。Zig 不会为每一次重复的错误都新建一条完整的记录,只会在匹配到相同错误时,给这个计数器+1,既节省了内存,又为后续的渲染提供了依据。

这里还有一个关键细节:msg 字段的类型是 String,本质是一个 u32 索引,而不是字符串本身。这是因为 Zig 用了字符串 Intern 机制,所有相同的错误消息文本,在编译器里只会存储一份,对应唯一的 u32 索引。这就意味着,判断两条错误的消息是否一致,只需要做一次极快的整数比较,不用逐字节对比字符串,性能直接拉满。

2.2 去重核心逻辑:添加错误前,先做精准匹配

接下来我们看 src/Compilation.zig 里的核心逻辑:编译器在添加一条新错误时,会先遍历已有的错误列表,做精准的重复判断,只有完全匹配的错误才会被合并计数。

我把源码里的核心逻辑精简出来,给大家逐行讲解:

//! src/Compilation.zig 中的错误添加核心逻辑fn addErrorMessage(comp: *Compilation, new_msg: ErrorBundle.ErrorMessage) !ErrorBundle.MessageIndex {const eb = &comp.error_bundle_wip;// 第一步:遍历已有的所有错误,检查是否重复for (eb.root_list.items) |existing_msg_idx| {const existing_msg = eb.tmpBundle().getErrorMessage(existing_msg_idx);// 第二步:核心匹配规则,三个维度必须完全一致const is_duplicate = existing_msg.msg == new_msg.msg // 错误消息完全相同and existing_msg.src_loc == new_msg.src_loc // 源码位置完全相同and existing_msg.notes_len == new_msg.notes_len; // 附带note数量完全相同if (is_duplicate) {// 第三步:匹配到重复错误,仅累加计数,不新增记录const count_field_offset = 1// count是结构体的第二个字段            eb.extra.items[@intFromEnum(existing_msg_idx) + count_field_offset] += 1;return existing_msg_idx;        }    }// 第四步:没有匹配到重复,新增一条错误记录returntry eb.addRootErrorMessage(new_msg);}

这个逻辑真的太简洁优雅了,没有任何花里胡哨的操作,却完美解决了错误去重的核心问题。

这里的匹配规则设计得特别严谨,我给大家拆解一下:

  1. 错误消息完全一致:保证报错的内容是同一个,不会把不同的错误误合并
  2. 源码位置完全一致:文件路径、行号、列号、代码span范围必须完全相同,哪怕是同一句代码,出现在不同行也不会被去重
  3. Note数量完全一致:附带的提示、调用栈、引用追踪数量必须相同,避免把带不同调试信息的同一个错误合并,丢失关键线索

只有三个条件全部满足,才会被判定为重复错误,既保证了去重的效果,又绝对不会误判,这个细节真的太用心了。

2.3 渲染阶段:把计数展示给开发者

最后一步,就是在终端渲染报错的时候,把这个计数展示出来。我们回到 ErrorBundle.zig 的 renderErrorMessageToWriter 函数,这里就是我们看到的 (N times) 标记的来源:

if (err_msg.count == 1) {// 只出现一次,正常渲染trywriteMsg(eb, err_msg, w, prefix_len);try w.writeByte('\n');else {// 出现多次,渲染错误消息+计数标记try writeMsg(eb, err_msg, w, prefix_len);try ttyconf.setColor(w, .dim); // 用浅灰色标记,不抢主错误的风头try w.print(" ({d} times)\n", .{err_msg.count});try ttyconf.setColor(w, .reset);}

就连渲染的细节都做得特别贴心:计数标记用浅灰色展示,不会干扰我们看核心错误信息,同时又清晰地告诉我们这个错误出现了多少次。


3. 核心知识点全面拆解

3.1 去重机制的设计哲学:开发者第一

Zig 的整个设计都贯穿着「开发者第一」的理念,错误去重机制就是最好的体现。它没有把「报错越多越详细」当作目标,而是把「帮开发者快速定位问题」作为核心,用最小的成本解决了行业里几十年的痛点。

同时,这个设计也兼顾了性能:配合字符串 Intern 机制,去重判断的成本极低,哪怕是大型项目里有上万个错误,遍历判断也不会造成明显的编译性能损耗。

3.2 增量编译里的延伸应用

这个去重机制在增量编译里更是发挥了巨大作用。Zig 的增量编译会保留上一次编译的错误列表,当我们修改了部分代码后,编译器只会重新分析修改的部分,新生成的错误会和历史错误做去重,不会重复报已经存在的错误,同时会自动移除已经修复的错误。

这就是为什么 Zig 的增量编译报错永远那么清爽,不会像其他编译器一样,改一行代码就把所有错误重新吐一遍。

3.3 为什么不用哈希表做去重?

很多姐妹可能会问:遍历列表判断重复,数据量大了不会慢吗?这里 Zig 的设计有一个巧妙的考量:

  • 编译错误的数量,正常情况下不会特别多,哪怕是大型项目,单次编译的错误数量也大多在几百条以内,线性遍历的成本完全可以忽略
  • 不用哈希表,避免了哈希计算、哈希冲突处理的额外开销,代码更简单,维护成本更低,也不会有哈希碰撞导致的误判风险
  • 配合整数索引的快速比较,线性遍历的实际性能甚至比哈希表更好

这就是 Zig 「简单但不简陋」的设计哲学,不用复杂的技术,只用最贴合场景的方案解决问题。


4. 实际代码实例:亲手感受去重机制的魅力

给大家准备了3个可直接编译运行的示例,姐妹们可以复制到本地,亲手感受一下 Zig 错误去重的效果。

示例1:基础用法,循环里的重复错误去重

这是最常见的场景,循环里触发的相同错误,Zig 会完美去重:

// test_loop_dedup.zigconststd = @import("std");pub fn main() !void{// 循环10次,每次都触发完全相同的类型错误for (0..10) |i| {// 错误:无符号类型u8不能赋值为负数        var x: u8 = -@as(i32, @intCast(i));        _ = x;    }}

编译结果

test_loop_dedup.zig:7:18: error: cannot assign negative value to unsigned type'u8'        var x: u8 = -@as(i32, @intCast(i));                 ^~~~~~~~~~~~~~~~~~~~~~~~~~ (10 times)

可以看到,10次循环触发的相同错误,编译器只报了1次,末尾标了 (10 times),完全没有刷屏,太清爽了!

示例2:进阶用法,泛型实例化的重复错误去重

泛型多次实例化触发的相同错误,也能完美去重:

// test_generic_dedup.zigconststd = @import("std");// 泛型函数,非整数类型实例化会触发固定错误fn onlyIntGeneric(comptime T: type)void{if (@typeInfo(T) != .int) {        @compileError("this function only accepts integer types!");    }    var a: T = 1;    _ = a + 2;}pub fn main() !void{// 3次实例化,触发完全相同的错误    onlyIntGeneric(f32);    onlyIntGeneric(f64);    onlyIntGeneric(bool);}

编译结果

test_generic_dedup.zig:7:9: error: this function only accepts integer types!        @compileError("this function only accepts integer types!");        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (3 times)

3次实例化的错误消息、源码位置完全一致,编译器直接去重,只报一次。如果错误消息里包含类型名,内容不同,编译器就不会去重,保证了准确性,大家可以自己试试~

示例3:边界场景,不同位置的相同错误不会去重

如果错误消息相同,但源码位置不同,编译器不会误判去重:

// test_no_dedup.zigconststd = @import("std");pub fn main() !void{    var a: u8 = -1// 第5行,错误1    var b: u8 = -2// 第6行,错误2    _ = a;    _ = b;}

编译结果

test_no_dedup.zig:5:16: error: cannot assign negative value to unsigned type 'u8'    var a: u8 = -1;               ^~test_no_dedup.zig:6:16: error: cannot assign negative value to unsigned type 'u8'    var b: u8 = -2;               ^~

哪怕错误消息完全一样,但是行号不同,编译器会分别报错,不会去重,完全不会丢失关键信息。


5. 对比/彩蛋

和其他语言的对比

  • **C/C++**:GCC/Clang 没有全局的错误去重机制,循环、模板实例化里的重复错误会疯狂刷屏,找问题要翻半天屏幕,体验和 Zig 天差地别。
  • Rust:编译器有基础的去重能力,但对于宏展开、泛型实例化里的重复错误,还是会报多条,也没有像 Zig 这样清晰的 (N times) 标记,体验不如 Zig 贴心。

源码里的小彩蛋

我翻源码的时候发现,ErrorMessage 里的 count 字段,注释只有短短一句 Usually one, but incremented for redundant messages.,没有多余的废话,和整个去重机制的设计一样,简洁又精准。

还有一个特别温柔的细节:去重判断里,不仅要匹配错误消息和位置,还要匹配 notes_len。这是因为如果同一个错误,附带了不同的调用栈、引用追踪信息,那对应的是不同的触发场景,合并之后会丢失关键的调试信息。Zig 连这个边界场景都考虑到了,真的太懂开发者了。


6. 小结

Zig 的错误去重机制,用极简的实现,解决了系统编程领域几十年的错误刷屏痛点。它没有用任何复杂的技术,只是靠着对开发者需求的深刻理解,和严谨的细节设计,做到了「既不丢失任何关键信息,又不让无效信息干扰开发者」,这就是 Zig 「开发者第一」设计哲学的灵魂。


好了,第84篇到此结束。

下篇我们会继续扒 Zig 编译器里的错误信息渲染逻辑,看看那些被大家戏称「毒舌又人性化」的报错提示,到底是怎么从源码里生成的。

如果你也被 Zig 的这个设计惊艳到,或者曾经被 C++ 的错误刷屏折磨到崩溃,欢迎评论区贴出你的代码/报错,我们一起扒源码~

Zachel | Zig进阶系列第84篇 我们下篇见!

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-02 12:31:15 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/699017.html
  2. 运行时间 : 0.163045s [ 吞吐率:6.13req/s ] 内存消耗:4,816.07kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fbabfef60f5dc2c729fc73149aecf046
  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.000918s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001321s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.008294s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000602s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001211s ]
  6. SELECT * FROM `set` [ RunTime:0.000525s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001323s ]
  8. SELECT * FROM `article` WHERE `id` = 699017 LIMIT 1 [ RunTime:0.003792s ]
  9. UPDATE `article` SET `lasttime` = 1780374675 WHERE `id` = 699017 [ RunTime:0.000910s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000280s ]
  11. SELECT * FROM `article` WHERE `id` < 699017 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000438s ]
  12. SELECT * FROM `article` WHERE `id` > 699017 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000371s ]
  13. SELECT * FROM `article` WHERE `id` < 699017 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001344s ]
  14. SELECT * FROM `article` WHERE `id` < 699017 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000991s ]
  15. SELECT * FROM `article` WHERE `id` < 699017 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000795s ]
0.164728s