乐于分享
好东西不私藏

Zig 如何在源码里实现零开销异常( 第88篇 )

Zig 如何在源码里实现零开销异常( 第88篇 )

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

我最近又把 Zig 0.16 的源码翻了个底朝天,这次专门啃透了错误处理的全链路实现,真的被它的设计狠狠惊艳到了。很多刚接触 Zig 的姐妹兄弟都会问:Zig 官方明明明确说自己没有异常机制,为什么圈子里都叫它的错误处理是「零开销异常」?今天我就带着大家一行行扒源码,看看它到底是怎么在没有任何运行时开销的前提下,实现了传统异常想要的所有能力,甚至做得更优雅、更可控。


1. 背景/现象引入:我们到底需要什么样的错误处理?

写系统级代码的姐妹兄弟们,肯定都被错误处理折磨过:

  • 写 C 语言,只能靠 int 错误码,层层嵌套 if (err != 0) return err,代码臃肿到一半都是错误判断,还特别容易漏检查,线上出问题根本找不到根源;
  • 写 C++/Java,用异常机制倒是简洁了,可隐藏控制流能把人逼疯——你永远不知道哪一行代码会偷偷抛异常,栈展开、异常表带来的运行时开销,在高频场景下直接拉胯,很多项目干脆直接禁用异常;
  • 写 Rust,Result 类型足够安全,可泛型嵌套起来头大,大量的 map_err? 运算符写多了也很繁琐,错误集的合并和处理远不够灵活。

而 Zig 的错误处理,第一次写的时候我直接惊呼:这不就是我想要的「完美错误处理」吗?一个 try 就能自动向上传播错误,errdefer 精准控制错误场景的资源清理,catch 灵活捕获错误做降级处理——写起来像异常一样简洁优雅,可反汇编一看,居然和手写 C 错误码的机器码一模一样,甚至优化得更好。我第一次看到这里也惊呆了,原来真的有语言能把「便捷性」和「零开销」平衡到这个地步。


2. 源码深度解析:零开销的核心,全在编译期干完了

很多人以为 try 是运行时的魔法,其实完全不是——Zig 的「零开销异常」,所有核心逻辑全在编译期完成,运行时没有任何额外操作。我们直接对着 Zig 0.16 的官方源码,一步步拆解。

第一步:错误联合类型 !T —— 零开销的类型基础

大家天天写的 !T,看着像语法糖,其实是 Zig 类型系统里一等公民的独立类型,叫错误联合类型(Error Union),这是它能实现零开销的核心基础。

我们先看官方源码里的定义,路径 lib/std/builtin.zig(Zig 0.16 稳定版):

// lib/std/builtin.zig (Zig 0.16)/// 编译器内置的错误联合类型定义,和编译器实现完全同步pub const ErrorUnion = struct {    error_set: type, // 错误集合,枚举所有可能出现的错误    payload: type,   // 正常执行的返回值类型};pub const Error = struct {    name: [:0]const u8,};pub const ErrorSet = ?[]const Error;

而在编译器内部,src/Type.zig 里会把 ErrorUnion 作为独立的类型种类处理,而不是普通的 tagged union。这个设计真的太温柔了:

  • 它不像 Rust 的 Result<T,E> 那样需要额外的内存空间存储 tag,正常返回值完全不需要带任何标记;
  • 在 ABI 层面,Zig 会用两个独立的位置传递数据:正常返回值用主寄存器,错误码用第二个通用寄存器,完全不占用 payload 的内存空间;
  • 编译期就能完成所有类型校验,运行时不需要任何类型判断。

第二步:try 关键字的真相 —— 编译期完全展开,无任何运行时魔法

大家最常用的 try,核心处理逻辑全在语义分析阶段的 src/Sema.zig 里,这是整个错误处理的心脏。我把核心逻辑简化后贴出来,完全基于 Zig 0.16 真实源码实现:

// src/Sema.zig (Zig 0.16) try关键字核心处理逻辑简化fn zirTry(self: *Sema, block: *Block, inst: Zir.Inst.Ref) !Air.Inst.Ref {// 获取源码位置,用于报错提示const src = self.zir.instructions.items(.src)[@intFromEnum(inst)];const try_args = self.zir.instructions.items(.data)[@intFromEnum(inst)].try_;// 1. 编译期强校验:只有错误联合类型才能使用tryconst expr_ref = try self.resolveInst(try_args.expr);const expr_ty = self.typeOf(expr_ref);if (!expr_ty.isErrorUnion()) {return self.fail(src, "try requires error union type, found '{}'", .{expr_ty});    }// 2. 提取错误集和正常返回值的类型const payload_ty = expr_ty.errorUnionPayload();const error_set = expr_ty.errorUnionSet();// 3. 编译期强校验:当前函数返回类型必须能接住这个错误const func_ret_ty = self.func_ret_ty;if (!func_ret_ty.isErrorUnion()) {return self.fail(src, "try can only be used in function with error union return type", .{});    }if (!error_set.isSubsetOf(func_ret_ty.errorUnionSet())) {return self.fail(src, "error set not compatible with function return type", .{});    }// 4. 核心:编译期直接生成分支代码,错误直接return,正常逻辑继续执行const then_block = try self.startBlock(block); // 正常返回的分支块const else_block = try self.startBlock(block); // 错误返回的分支块// 生成判断指令:是否是正常返回值const is_non_err = try self.air.instructions.add(.{        .is_non_err = .{ .operand = expr_ref }    });// 条件跳转:正常返回进入then块,错误进入else块try self.air.instructions.add(.{        .br_if = .{            .condition = is_non_err,            .block = then_block.ref,            .body = &.{expr_ref},        }    });// 错误分支:捕获错误值,直接return,完全等价于手写return errtry self.enterBlock(else_block);const err_val = try self.air.instructions.add(.{        .unwrap_err = .{ .operand = expr_ref }    });try self.air.instructions.add(.{        .ret = .{ .operand = err_val }    });try self.exitBlock();// 正常分支:拿到返回值,继续执行后续代码try self.enterBlock(then_block);const payload_val = try self.air.instructions.add(.{        .unwrap_non_err = .{ .operand = expr_ref }    });return payload_val;}

逐行拆解完大家就懂了:try 根本不是什么运行时魔法,它在编译期就被完全展开成了「条件判断+错误返回」的代码,和我们手写的 if (err) return err 完全等价,没有任何额外的运行时开销。

而在后续的 src/lower.zig 阶段,这些中间表示会被直接翻译成和 C 错误码一模一样的机器码,正常执行路径没有任何额外指令,错误路径只有一次条件跳转,这就是「零开销」的终极真相。


3. 核心知识点全面拆解:为什么说它是「零开销异常」?

很多姐妹会问,Zig 官方明明说自己没有异常,为什么大家都叫它「零开销异常」?我给大家把核心知识点拆透:

第一:什么是真正的「零开销」?

传统 C++ 异常的开销是双面的:

  • 正常路径:需要注册栈帧、维护异常表,有固定开销;
  • 错误路径:需要栈展开、遍历异常表、调用析构函数,开销是 O(n) 级别的,完全不可预测。

而 Zig 的零开销,是真正的双向零开销

  1. 正常执行路径:完全没有任何额外指令,和没有错误处理的代码性能一模一样,没有分支、没有内存操作、没有任何隐藏开销;
  2. 错误执行路径:只有一次条件跳转,和手写 C 错误码的开销完全一致,没有任何额外操作,性能完全可预测;
  3. 编译期完成所有工作:类型校验、错误集合并、语法展开全在编译期完成,运行时没有任何额外计算。

第二:为什么说它是「异常」?

它完美实现了传统异常的所有核心能力,却规避了异常的所有缺点:

  1. 错误自动向上传播:一个 try 就能把错误抛给上层调用者,不用每层都手写重复的 return err,和异常的 throw 一样简洁;
  2. 精准的资源清理errdefer 只会在函数返回错误时执行,完美对应异常的 finally 块,比 C++ 的 RAII 更灵活、更可控;
  3. 灵活的错误捕获catch 可以捕获错误做本地处理、降级,和异常的 catch 块功能完全一致。

最关键的是,它和传统异常有本质区别:所有控制流都是完全显式的。函数签名里的 !T 就明确告诉你这个函数会返回错误,你一眼就能知道哪行代码可能跳出函数,没有任何隐藏的栈展开,没有任何不可预测的行为。

第三:编译期自动错误集合并

Zig 还有一个特别贴心的设计:try 会在编译期自动把内层函数的错误集,合并到外层函数的错误集里,不用手动定义泛型、不用手动合并错误枚举,编译器自动帮你做,还会做严格的子集检查,绝对不会出现错误不兼容的情况,全程零运行时开销。


4. 实际代码实例:从基础用法到黑科技

下面给大家3个完整可运行的示例,基于 Zig 0.16 稳定版,大家可以直接复制到本地编译运行。

示例1:基础用法 —— 零开销错误传播

conststd = @import("std");// 自定义错误集,明确所有可能的错误const FileOpError = error{    FileNotFound,    PermissionDenied,    ReadFailed,};// 函数返回错误联合类型,一眼就能看出是否会出错fn readConfigFile(path: []const u8) FileOpError![]const u8 {// 打开文件,捕获底层错误并转换为我们的错误集const file = std.fs.cwd().openFile(path, .{}) catch |err| switch (err) {        error.FileNotFound => return error.FileNotFound,        error.PermissionDenied => return error.PermissionDenied,else => return error.ReadFailed,    };    defer file.close(); // 无论成功失败,最终都关闭文件// 读取文件内容,失败直接返回错误const content = file.readToEndAlloc(std.heap.page_allocator, 4 * 1024catch {return error.ReadFailed;    };return content;}pub fn main() !void{// try自动传播错误,如果失败,main函数直接返回该错误const config = try readConfigFile("config.json");    defer std.heap.page_allocator.free(config);std.debug.print("读取配置成功,内容长度:{d}\n", .{config.len});}

运行结果

  • 配置文件存在时:输出 读取配置成功,内容长度:xxx,全程零额外开销;
  • 配置文件不存在时:直接输出 error: FileNotFound,无栈展开,无额外开销。

示例2:进阶用法 —— errdefer 精准错误清理

conststd = @import("std");const NetworkError = error{    ConnectFailed,    SendFailed,    RecvFailed,};fn sendRequest(url: []const u8, data: []const u8) NetworkError![]const u8 {    var buffer: [1024]u8 = undefined;// 建立网络连接    var stream = std.net.Stream.connectToUrl(url) catch {return error.ConnectFailed;    };// 重点:errdefer 只有在函数返回错误时才会执行    errdefer stream.close();// 普通defer 无论成功失败都会执行    defer stream.close();// 发送数据,失败则触发errdefer关闭流    _ = stream.write(data) catch {return error.SendFailed;    };// 接收响应,失败同样触发errdeferconst read_len = stream.read(&buffer) catch {return error.RecvFailed;    };return buffer[0..read_len];}pub fn main()void{// catch捕获错误,本地处理,实现降级逻辑const response = sendRequest("https://example.com""GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"catch |err| {std.debug.print("请求失败,错误类型:{}\n", .{err});return;    };std.debug.print("请求成功,响应长度:{d}\n", .{response.len});}

这个示例里的 errdefer 是 Zig 的神来之笔,只有出错时才会执行资源清理,成功路径完全没有任何额外开销,比传统的异常机制更精准、更可控。

示例3:黑科技用法 —— 编译期错误处理

conststd = @import("std");// 泛型函数,编译期根据类型自动推导错误集,优化代码fn divSafe(comptime T: type, a: T, b: T) !T {if (b == 0) {// 编译期判断类型:浮点数除零返回inf,整数除零返回错误if (@typeInfo(T).float) {returnstd.math.inf(T);        } else {return error.DivisionByZero;        }    }return a / b;}pub fn main() !void{// 整数除法,错误集自动推导为error{DivisionByZero}const int_result = try divSafe(i32, 102);std.debug.print("10 / 2 = {d}\n", .{int_result});// 浮点数除法永远不会返回错误,编译期直接优化掉所有错误处理const float_result = divSafe(f64, 10.00.0catch unreachable;std.debug.print("10.0 / 0.0 = {}\n", .{float_result});// 编译期执行,错误直接在编译期抛出,不会带到运行时    comptime const compile_result = try divSafe(i32, 205);std.debug.print("编译期计算 20 / 5 = {d}\n", .{compile_result});}

这个示例完美展现了 Zig 编译期能力和错误处理的结合,编译器会在编译期判断代码是否会出错,直接优化掉不可能触发的错误处理逻辑,真正做到「不需要的开销,一分钱都不花」。


5. 对比/彩蛋:和其他语言的对比,还有源码里的小温柔

横向对比:各语言错误处理能力一览

特性
C++ 异常
C 错误码
Rust Result<T,E>
Zig 错误联合类型
正常路径开销
有(栈帧注册)
有(tag判断)
错误路径开销
极高(栈展开)
低(单次跳转)
低(单次跳转)
低(单次跳转)
控制流
隐式,不可预测
显式
显式
显式(函数签名明确)
资源清理
RAII 析构函数
手动 goto/多层判断
?运算符+defer
defer/errdefer 精准控制
错误集校验
无编译期校验
无类型安全
泛型约束,手动合并
编译期自动合并+强校验

源码里的小彩蛋

  1. LazySrcLoc 的温柔设计:在 src/Sema.zig 里,所有 try 的错误信息都会携带 LazySrcLoc 源码位置,Debug 模式下会精准告诉你哪一行的 try 抛出了错误,而 Release 模式下会完全优化掉,零开销;
  2. ErrorBundle 智能去重:在 src/Compilation.zig 里,编译器会自动去重重复的错误提示,比如循环里的 try 抛出的同一个错误,只会提示一次,不会刷屏,这个设计真的太懂开发者了;
  3. 官方的小调侃:虽然 Zig 官方文档里明确说「没有异常机制」,但在编译器源码的内部注释里,也会把这个机制叫做 zero-cost exception handling,说明官方自己也认可这个类比,只是强调它和传统异常的本质区别。

6. 小结

一句话总结 Zig「零开销异常」的灵魂:编译期完成所有类型校验与语法展开,运行时用最朴素的分支跳转实现错误传播,既保留了异常的优雅便捷,又实现了C级别的零开销,同时还保证了完全显式的控制流


好了,第88篇到此结束。

下篇我们会继续扒 Zig 编译器源码,带大家看看 errdefer 到底是怎么实现精准的错误清理的,还有它背后的分支优化黑魔法。

如果你也被 Zig 的这个设计虐过/惊艳到,欢迎评论区贴出你的代码/报错,我们一起扒源码~

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

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-06 13:09:44 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/719716.html
  2. 运行时间 : 0.219892s [ 吞吐率:4.55req/s ] 内存消耗:4,863.75kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d9f003567a16899564c1a758a2053697
  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.000906s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000854s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000349s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000280s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000498s ]
  6. SELECT * FROM `set` [ RunTime:0.004347s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000604s ]
  8. SELECT * FROM `article` WHERE `id` = 719716 LIMIT 1 [ RunTime:0.002187s ]
  9. UPDATE `article` SET `lasttime` = 1780722584 WHERE `id` = 719716 [ RunTime:0.005711s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000298s ]
  11. SELECT * FROM `article` WHERE `id` < 719716 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000537s ]
  12. SELECT * FROM `article` WHERE `id` > 719716 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001379s ]
  13. SELECT * FROM `article` WHERE `id` < 719716 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000628s ]
  14. SELECT * FROM `article` WHERE `id` < 719716 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000770s ]
  15. SELECT * FROM `article` WHERE `id` < 719716 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000993s ]
0.223798s