乐于分享
好东西不私藏

Zig 如何用源码实现可组合的错误处理( 第82篇 )

Zig 如何用源码实现可组合的错误处理( 第82篇 )

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

我最近又把 Zig 0.16 的源码翻了个底朝天,这次专门啃完了错误处理全链路的实现,真的被它「可组合」的设计狠狠戳中了。毕竟写了这么多年C/C++,谁没被层层嵌套的错误码、拆不开的错误处理逻辑搞到崩溃过?而Zig的错误处理,居然能像搭积木一样,随便组合还不翻车,零开销还强类型,今天就带姐妹们兄弟们从源码根儿上,扒明白这个设计到底有多温柔又多硬核。

1. 背景/现象引入

写系统编程的姐妹们应该都懂,错误处理永远是代码里最闹心的部分:

  • 写C的时候,每层函数都要加一堆if (ret < 0)的判断,嵌套地狱直接把代码可读性拉满,还动不动就漏处理某个错误码,线上出问题查半天;
  • 写C++的时候,异常倒是不用写嵌套判断了,可隐藏的控制流让代码逻辑完全不可控,跨模块的异常兼容更是噩梦,还有栈展开的性能开销;
  • 就算是Rust的Result,组合起来也要写一堆map_errandThen,泛型约束写起来头大,稍微复杂点的调用链,错误类型转换就能搞疯人。

而Zig的错误处理,从设计之初就把「可组合性」刻进了骨子里。它不用你手动做类型转换,不用写冗余的嵌套判断,不用承担隐藏的运行时开销,从错误集合的定义、到错误的传播、再到错误的清理和处理,全链路都能像拼乐高一样自由组合,写起来顺,读起来清,还绝对安全。我第一次用它写跨平台IO代码的时候,几个try就把多层错误处理搞定了,真的惊呆了。

2. 源码深度解析

Zig可组合错误处理的所有魔法,都藏在两个核心源码文件里:src/Type.zig(类型系统核心,错误集合与错误联合类型的定义)、src/Sema.zig(语义分析核心,try/catch/errdefer的实现),我们直接扒源码看本质。

核心1:错误集合合并——类型层面可组合的根基

首先是错误集合的合并逻辑,这是Zig错误能自由组合的核心。Zig 0.16里,所有的错误名称都是全局唯一的,编译器会在编译期生成全局错误表,每个错误对应唯一的u16索引,错误集合本质上是全局错误表的一个子集,这让不同错误集合的合并、兼容成为了可能。

我们看src/Type.zig里的核心实现(简化后的官方源码片段):

// src/Type.zig (Zig 0.16 官方源码简化)pub const Type = struct {    pub const Tag = enum {        error_set,        error_union,// ... 其他类型标签    };    pub const Data = union(Tag) {        error_set: ErrorSet,        error_union: ErrorUnion,// ... 其他类型数据    };/// 错误集合类型,全局错误表的子集    pub const ErrorSet = struct {        names: []const []const u8, // 错误名称列表        global_indices: []const u16, // 对应全局错误表的唯一索引    };/// 错误联合类型 E!T,Zig错误处理的核心载体    pub const ErrorUnion = struct {        error_set: Type, // 错误集合部分        payload_type: Type, // 正常返回值部分    };/// 合并两个错误集合,实现 || 运算符的核心逻辑pub fn mergeErrorSets(a: Type, b: Type) Type {// 边界处理:任意一个是anyerror,合并后也是anyerrorif (a.isAnyError() or b.isAnyError()) return Type.initTag(.anyerror);        var merged_names = std.ArrayList([]const u8).init(std.heap.page_allocator);        defer merged_names.deinit();// 加入第一个集合的所有错误for (a.errorSet().names) |name| try merged_names.append(name);// 加入第二个集合的所有错误,自动去重for (b.errorSet().names) |name| {for (merged_names.items) |existing| {if (std.mem.eql(u8, existing, name)) break;            } elsetry merged_names.append(name);        }// 错误名称排序,确保合并顺序不影响最终类型一致性std.sort.sort([]const u8, merged_names.items, {}, struct {            fn lessThan(_: void, a: []const u8, b: []const u8) bool {returnstd.mem.lessThan(u8, a, b);            }        }.lessThan);// 生成新的错误集合类型,关联全局索引return Type.init(.{            .error_set = .{                .names = merged_names.toOwnedSlice(),                .global_indices = generateGlobalErrorIndices(merged_names.items),            },        });    }};

这个函数真的把细节做满了,我第一次看的时候就觉得这个设计太温柔了:

  1. 自动去重:同名错误会被合并,比如两个集合都有OutOfMemory,合并后只会保留一个,不会出现类型冲突;
  2. 排序保证一致性:不管是A || B还是B || A,最终得到的是同一个类型,不会出现不必要的类型差异;
  3. 全局索引关联:合并后的错误依然和全局错误表绑定,跨模块传递完全不会有兼容性问题。

核心2:try关键字——错误传播可组合的灵魂

如果说错误集合合并是类型层面的可组合,那try关键字就是调用链层面的可组合核心。很多人以为try只是catch |err| return err的语法糖,但源码里的实现远比这个更强大,它实现了自动的错误集合合并,让你可以在一个函数里无限嵌套try,完全不用手动处理错误类型。

我们看src/Sema.zig里的analyzeTry函数(简化后的官方源码片段):

// src/Sema.zig (Zig 0.16 官方源码简化)fn analyzeTry(    self: *Sema,    block: *Block,    src: LazySrcLoc,    try_expr: Zir.Inst.Ref,) !Air.Inst.Ref {// 1. 类型检查:try的表达式必须是错误联合类型const expr_ty = try self.typeOf(block, try_expr);if (!expr_ty.isErrorUnion()) {return self.fail(src, "try requires error union type, found '{}'", .{expr_ty});    }// 2. 提取错误联合类型的错误集合和payload类型const err_set = expr_ty.errorUnionSet();const payload_ty = expr_ty.errorUnionPayload();// 3. 检查当前函数返回类型必须支持错误传播const fn_ret_ty = self.fn_ret_ty orelse {return self.fail(src, "try cannot be used in function with non-error return type", .{});    };if (!fn_ret_ty.isErrorUnion()) {return self.fail(src, "try requires function return type to be error union", .{});    }const fn_err_set = fn_ret_ty.errorUnionSet();// 4. 核心:自动合并错误集合,实现无感知的错误传播if (!fn_err_set.containsErrorSet(err_set)) {// 仅当函数返回类型是推断类型(!T)时,自动扩展错误集合if (self.fn_ret_ty_inferred) {const merged_err_set = Type.mergeErrorSets(fn_err_set, err_set);            self.fn_ret_ty = Type.init(.{                .error_union = .{                    .error_set = merged_err_set,                    .payload_type = fn_ret_ty.errorUnionPayload(),                },            });        } else {// 显式声明的错误集合,编译报错避免意外扩展return self.fail(src, "error set '{}' does not contain error '{}'", .{                fn_err_set, err_set,            });        }    }// 5. 生成零开销的AIR指令,拆分成功/错误分支const try_result = try self.analyzeExpr(block, try_expr);const br_block = try self.makeBlock(block);const err_block = try self.makeBlock(block);try self.condBr(block, src, try_result, br_block, err_block);// 错误分支:直接向上返回错误,无任何额外开销    self.setCurrBlock(err_block);const err_val = try self.extractError(block, src, try_result);try self.ret(block, src, err_val);// 成功分支:提取payload值,继续执行后续逻辑    self.setCurrBlock(br_block);returntry self.extractPayload(block, src, try_result);}

这就是try的魔法本质:它不只是语法糖,更是编译期自动完成错误集合合并的核心。当你在函数里写多个try的时候,编译器会自动把所有try里的错误合并到函数的错误集合里,完全不用你手动声明、手动转换,真正实现了错误传播的无限可组合。

3. 核心知识点全面拆解

扒完源码,我们把可组合错误处理的核心知识点讲透,一个细节都不落下:

  1. 全局唯一错误模型:Zig里所有error.XXX都是全局唯一的,编译期会生成全程序唯一的错误表,这是错误集合可以跨模块、跨函数自由合并的基础。
  2. 可组合的三个核心维度
    • 类型层面可组合:用||运算符合并任意错误集合,支持编译期条件组合,完美适配跨平台等场景;
    • 传播层面可组合:try关键字自动合并错误集合,无限嵌套调用链的错误可以无感知向上传播,无需手动处理类型转换;
    • 逻辑层面可组合:catch、switch、errdefer可以任意搭配,局部处理可恢复错误,剩余错误继续向上传播,实现灵活的分层处理。
  3. 真正的零开销抽象:Zig的错误处理完全没有运行时开销,正常返回值和错误用不同的寄存器传递,没有tag枚举的内存开销,错误分支直接编译成跳转指令,比C的错误码更高效,完全没有C++异常的栈展开开销。
  4. 强制安全的类型检查:编译器会强制你处理所有错误,要么用try传播,要么用catch处理,要么用switch穷尽匹配,绝对不会出现C里漏处理错误码的情况;同时显式声明的错误集合不会被意外扩展,兼顾了灵活性和安全性。
  5. 编译期原生支持:错误集合的合并、类型推导全在编译期完成,完美适配comptime特性,可以根据编译期条件生成不同的错误集合,实现编译期和运行时的全链路可组合。

4. 实际代码实例

给姐妹们准备了3个完整可运行的示例,从基础用法到进阶黑科技,带大家亲手感受可组合错误处理的魅力。

示例1:基础可组合错误处理(日常开发必备)

// Zig 0.16 可直接编译运行conststd = @import("std");// 定义两个独立的错误集合const FileError = error{    FileNotFound,    PermissionDenied,    DiskFull,};const ParseError = error{    InvalidFormat,    MissingField,    OutOfMemory,};// 类型层面组合:合并两个错误集合const ConfigError = FileError || ParseError;// 读取文件,返回FileErrorfn readConfigFile(path: []const u8) FileError![]const u8 {    _ = path;return error.FileNotFound; // 模拟读取失败}// 解析配置,返回ParseErrorfn parseConfig(data: []const u8) ParseError!struct { name: []const u8, port: u16 } {    _ = data;return error.InvalidFormat; // 模拟解析失败}// 传播层面组合:多个try自动合并错误集合fn loadConfig(path: []const u8) !struct { name: []const u8, port: u16 } {const data = try readConfigFile(path);const config = try parseConfig(data);return config;}pub fn main()void{// 逻辑层面组合:catch局部处理错误,兜底默认值const config = loadConfig("config.toml"catch |err| {std.debug.print("加载配置失败: {}\n", .{err});return .{ .name = "default", .port = 8080 };    };std.debug.print("配置加载成功: name={s}, port={}\n", .{ config.name, config.port });}

运行结果:

加载配置失败: error.FileNotFound

示例2:进阶用法,编译期+errdefer+switch分层处理

// Zig 0.16 可直接编译运行conststd = @import("std");// 编译期条件组合错误集合,跨平台自动适配const OsError = if (@import("builtin").os.tag == .linux)    error{ EpollError, InotifyError }elseif (@import("builtin").os.tag == .windows)    error{ IOCPError, WSAError }else    error{ GenericOsError };// 组合系统错误和网络错误const NetworkError = error{    ConnectionRefused,    Timeout,    HostUnreachable,} || OsError;// errdefer与错误处理完美组合,错误时自动清理资源fn connectToServer(addr: []const u8) NetworkError!std.net.Stream {    var stream = trystd.net.tcpConnectToHost(std.heap.page_allocator, addr, 80);// 仅函数返回错误时执行,成功则不执行,和错误处理逻辑完全解耦    errdefer stream.close();return error.ConnectionRefused; // 模拟握手失败// return stream; // 成功时返回流,不会执行errdefer}pub fn main() !void{// switch分层处理错误:可恢复的本地处理,不可恢复的继续传播const stream = connectToServer("example.com"catch |err| switch (err) {        error.Timeout => {std.debug.print("连接超时,重试中...\n", .{});returntry connectToServer("example.com");        },else => return err,    };    defer stream.close();std.debug.print("连接成功!\n", .{});}

示例3:黑科技用法,泛型通用错误处理逻辑

// Zig 0.16 可直接编译运行conststd = @import("std");// 泛型重试函数,适配任意返回错误联合类型的函数,无限可组合fn retry(comptime Fn: type, func: Fn, max_retries: u32) !@typeInfo(Fn).fn.return_type.?.error_union.payload_type {const RetType = @typeInfo(Fn).fn.return_type.?;if (!@typeInfo(RetType).error_union) {        @compileError("函数必须返回错误联合类型");    }    var retries: u32 = 0;while (retries < max_retries) : (retries += 1) {if (func()) |payload| {return payload;        } else |err| {std.debug.print("第{}次尝试失败: {}\n", .{ retries + 1, err });continue;        }    }return func(); // 重试耗尽,返回最终错误}// 测试用的随机失败函数fn randomFail() !i32 {const rand = std.crypto.random;if (rand.int(u8) % 4 == 0return42;return error.RandomFailure;}pub fn main() !void{const result = try retry(@TypeOf(randomFail), randomFail, 3);std.debug.print("最终成功,结果: {}\n", .{result});}

5. 对比/彩蛋

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

特性
Zig 可组合错误处理
C 错误码
C++ 异常
Rust Result
可组合性
原生支持,编译期自动合并,零成本组合
手动判断,嵌套地狱,无组合能力
隐藏控制流,跨模块不可组合
需手动封装,泛型约束复杂
运行时开销
零开销,寄存器传递,直接跳转
有开销,每层需判断返回值
有开销,栈展开机制
零开销,枚举tag匹配
类型安全
强类型,强制穷尽处理,编译期全检查
无类型安全,易漏处理
无编译期检查,易捕获失败
强类型,强制穷尽匹配
编译期可组合
原生支持,条件生成、自动合并
不支持
不支持
有限支持,需宏实现

源码里的小彩蛋

  1. LazySrcLoc精准定位:在analyzeTry等所有语义分析函数里,都带了LazySrcLoc参数,它会延迟解析源码位置,既提升了编译速度,又能让错误提示精准定位到你写的那一行try,这就是Zig错误提示“毒舌又人性化”的根源。
  2. 编译器自己也用这套机制:Zig编译器自身的错误处理,就是用的这套可组合错误处理,ErrorBundle会合并多个编译错误,一次输出所有问题,而不是遇到一个就停,自己吃自己的狗粮,真的很靠谱。
  3. 合并排序的细节mergeErrorSets里对错误名称排序的设计,看似不起眼,实则非常关键——它保证了error{A} || error{B}error{B} || error{A}是完全相同的类型,避免了不必要的类型差异,让组合逻辑更稳定。

6. 小结

Zig可组合错误处理的灵魂,是用编译期的类型系统、全局唯一的错误模型,实现了零开销、强类型、无限可组合的错误处理,让错误处理逻辑像搭积木一样灵活,同时又绝对安全可控

好了,第82篇到此结束。

下篇我们会继续扒Zig错误处理的底层细节,带大家看看零开销错误堆栈的源码实现,看看它是怎么在不损失性能的情况下,给你最精准的错误定位。

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

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

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-31 16:27:08 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/690214.html
  2. 运行时间 : 0.115649s [ 吞吐率:8.65req/s ] 内存消耗:4,696.81kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=5ec3fb5561633a13a1ee75e674074a2e
  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.000778s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001149s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000466s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000421s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000830s ]
  6. SELECT * FROM `set` [ RunTime:0.000377s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000898s ]
  8. SELECT * FROM `article` WHERE `id` = 690214 LIMIT 1 [ RunTime:0.000731s ]
  9. UPDATE `article` SET `lasttime` = 1780216028 WHERE `id` = 690214 [ RunTime:0.003091s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000413s ]
  11. SELECT * FROM `article` WHERE `id` < 690214 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000778s ]
  12. SELECT * FROM `article` WHERE `id` > 690214 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000968s ]
  13. SELECT * FROM `article` WHERE `id` < 690214 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003303s ]
  14. SELECT * FROM `article` WHERE `id` < 690214 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001347s ]
  15. SELECT * FROM `article` WHERE `id` < 690214 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001471s ]
0.118471s