跳到内容
当前位置:首页>Excel>前端学习笔记 · 第 123 天:回调与异步流程控制——错误优先、串行与并发限制

前端学习笔记 · 第 123 天:回调与异步流程控制——错误优先、串行与并发限制

  • 2026-11-08 11:14:53
前端学习笔记 · 第 123 天:回调与异步流程控制——错误优先、串行与并发限制

前端学习笔记 · 第 123 天:回调与异步流程控制——错误优先、串行与并发限制

Day 123 · 第五阶段 · Node.js 与后端开发

排队的写法有三类:回调、Promise、async 与 await。回调最原始,也最容易把错误处理写漏;Promise 与 await 改善的是书写方式,不会自动给出并发上限。六个任务同时发出,与两个两个地发,代码只差几行,对下游的压力完全不同。

一、问题现场

四个现象:

  • 回调里写 if (err) throw err,外层的 try/catch 没有任何反应,进程直接退出。
  • 读取用户、订单、统计三层数据,回调套了三层,每一层都要重复一次错误判断。
  • 六个请求交给 Promise.all 一起发出,接口返回 429,日志显示瞬时并发为 6。
  • 想按顺序执行,写成 for 循环却漏了 await,循环瞬间结束,任务全部并发。

前两个属于回调的错误处理,后两个属于流程控制。

二、错误优先回调

回调是一个作为参数传入的函数,在异步操作完成时被调用。Node 的约定是错误优先:回调的第一个参数是错误对象,成功时为 null,失败时是 Error。

import { readFile } from "node:fs";readFile("notes.txt", (err, data) => {    if (err) {        console.log(err.code); // 失败:ENOENT        return;    }    console.log(data.length); // 成功:返回 Buffer});

实测缺失文件时 err.code为ENOENT,data为undefined;读取成功时err为null,data是Buffer,内容为hello\n时长度是 6 字节。失败分支里data不可用。

三条使用规则:

  • 先判断 err,非空就记录并 return,不继续使用 data。
  • 回调里的 throw 不会被调用方的 try/catch 接住。回调在异步阶段执行,调用栈早已返回;实测外层 catch 没有触发,同步流程先打印完,随后抛出未捕获异常,退出码为 1。
  • 一个回调只应被调用一次。重复调用会让后续逻辑执行两遍,需要在封装时自行保证。

回调也可以转成 Promise。promisify 接收「最后一个参数是错误优先回调」的函数,返回 Promise 版本:

import { promisify } from "node:util";import { readFile } from "node:fs";const readText = promisify(readFile);const text = await readText("notes.txt", "utf8");

实测返回值为字符串 "hello\n",与直接传 "utf8" 的结果一致。转换只改变调用方式,错误仍然在 Promise 里以拒绝的形式出现。

三、回调嵌套

每一步都依赖上一步的结果时,回调只能层层套进去:

function getUser(id, callback) {    setTimeout(() => callback(null, { id, name: "小明" }), 50);}function getOrders(user, callback) {    setTimeout(() => callback(null, [{ id: 1, amount: 99 }]), 50);}function getStats(orders, callback) {    setTimeout(() => callback(null, { total: 99 }), 50);}getUser(1, (err, user) => {    if (err) return console.log(err.code);    getOrders(user, (err, orders) => {        if (err) return console.log(err.code);        getStats(orders, (err, stats) => {            if (err) return console.log(err.code);            console.log(user.name, orders.length, stats.total);        });    });});

三层调用得到 小明 1 99。结构上能跑,问题在扩展:每加一步就多一层缩进,错误判断重复一遍,中间变量被外层包住,单独复用其中一段只能整段拷贝。

拆分的方式是把每层写成命名函数,回调里只做「判断错误、调用下一层」两件事。层级不会因此减少,但每一步都能单独阅读,错误处理也集中在一处。

四、串行

串行要求前一个任务结束后再开始下一个,最直接的写法是 for 循环里 await:

async function serial(tasks) {    const results = [];    for (const task of tasks) results.push(await task());    return results;}

每个 await 都会暂停循环,直到当前任务完成。六个延时分别为 300、200、400、100、500、250 毫秒的任务,延时合计 1750 毫秒,实测串行耗时 1784 毫秒,最大并发为 1。

串行适合有依赖的步骤:登录拿到令牌、用令牌请求数据、用数据渲染页面。顺序固定,任何一步失败都能立刻停下。

五、并行与并发限制

互不依赖的任务可以同时启动,Promise.all 接收一组 Promise,全部成功后按输入顺序返回结果:

async function parallel(tasks) {    return Promise.all(tasks.map((task) => task()));}

同一组任务实测耗时 510 毫秒,接近最慢的 500 毫秒任务,最大并发为 6。Promise.all 在第一个任务失败时立即拒绝,其余任务仍在后台继续执行,只是结果不再被采用。任务数量不受控制,这是它对下游的主要压力来源。

要限制同时执行的数量,需要一个池子:记录正在跑的任务,凑满上限就等最快的一个完成,再补进下一个。

async function limited(tasks, limit) {    const results = [];    const active = new Set();    for (const [index, task] of tasks.entries()) {        const job = Promise.resolve()            .then(() => task())            .then((value) => {                results[index] = value;                active.delete(job);            });        active.add(job);        if (active.size >= limit) await Promise.race(active);    }    await Promise.all(active);    return results;}

active 保存正在执行的任务,Promise.race(active) 返回最先结束的那一个;它完成后从集合里删除,循环继续补位。结果按 index 写回数组,所以返回顺序与输入一致,不受完成先后影响。

同一组任务以 2 为上限,实测耗时 922 毫秒,最大并发为 2。六个任务分三批,每批约 500 毫秒以内。

三种方式的选择依据:有依赖用串行;互不相干且数量小用并行;下游有承载上限时用限制并发。上限通常来自接口的限流规则或数据库连接数,取值应低于触发限流的阈值。

六、实战示例:三种执行方式对比

把三种跑法收进一个脚本,任务列表与延时完全相同,每种方式分别记录耗时与最大并发。

// run-tasks.mjs —— 串行、并行与限制并发三种执行方式const tasks = [    ["A", 300],    ["B", 200],    ["C", 400],    ["D", 100],    ["E", 500],    ["F", 250],].map(([name, ms]) => async () => {    await new Promise((resolve) => setTimeout(resolve, ms));    return name;});let running = 0;let maxRunning = 0;async function track(task) {    running += 1;    maxRunning = Math.max(maxRunning, running);    try {        return await task();    } finally {        running -= 1;    }}async function serial(tasks) {    const results = [];    for (const task of tasks) results.push(await track(task));    return results;}async function parallel(tasks) {    return Promise.all(tasks.map((task) => track(task)));}async function limited(tasks, limit) {    const results = [];    const active = new Set();    for (const [index, task] of tasks.entries()) {        const job = Promise.resolve()            .then(() => track(task))            .then((value) => {                results[index] = value;                active.delete(job);            });        active.add(job);        if (active.size >= limit) await Promise.race(active);    }    await Promise.all(active);    return results;}async function measure(label, runner) {    running = 0;    maxRunning = 0;    const started = performance.now();    const results = await runner();    const cost = Math.round(performance.now() - started);    console.log(`${label} ${cost}ms 结果 ${results.join(" ")} 最大并发 ${maxRunning}`);}await measure("串行", () => serial(tasks));await measure("并行", () => parallel(tasks));await measure("限制 2", () => limited(tasks, 2));

运行结果:

$ node run-tasks.mjs串行 1784ms 结果 A B C D E F 最大并发 1并行 510ms 结果 A B C D E F 最大并发 6限制 2 922ms 结果 A B C D E F 最大并发 2

串行耗时等于六段延时之和,并发的峰值始终为 1。并行把六段延时重叠在一起,总耗时由最慢的任务决定,峰值为 6。限制为 2 时,六个任务分三批推进,耗时约为并行的两倍,峰值稳定在上限。

track 在任务开始前加一、结束后减一(放在 finally 里,失败也会减),峰值用 Math.max 记录。三种方式的耗时每次运行会有几十毫秒的浮动,并发峰值与顺序保持不变。

常见问题

Q1:为什么回调的第一个参数必须是错误对象?

这是 Node 的统一约定,调用方不需要记每个函数的参数顺序,先看第一个参数就能判断成败。成功时传 null,失败时传 Error,错误码放在 err.code。

Q2:回调里的 throw 为什么外层接不住?

回调在异步阶段执行,那时调用方的函数栈已经返回,try/catch 的捕获范围也随之结束。抛出的错误变成未捕获异常,默认行为是打印堆栈并以退出码 1 结束进程。

Q3:串行、并行与并发限制如何选择?

后一步依赖前一步的结果时用串行;任务互不依赖、数量不大时用并行;下游有连接数或限流上限时用限制并发。并发上限取下游能稳定承受的值,而不是任务数。

Q4:Promise.all 属于并行还是并发?

它是并行:传入的任务一次性全部启动,没有数量上限。并发指的是同时执行的数量受控,Promise.all 不提供这个控制,所以任务多时要自己加池子。

Q5:并发限制为什么用 Promise.race?

池子凑满上限后,需要等其中一个完成才能补位。Promise.race 返回最先结束的任务,它在完成回调里把自己从集合中删除,循环随即补进下一个。

Q6:限制并发时如何保证结果顺序?

结果按下标写回数组:循环时用 tasks.entries() 拿到 index,任务完成后写入 results[index]。不要按完成顺序 push,否则返回顺序会随延时变化。

知识点总结

  • 回调约定:

    错误优先回调的第一个参数是 err,成功为 null,失败为 Error

  • 错误分支:

    先判断 err 并 return,失败时 data 为 undefined,不可继续使用

  • 抛错边界:

    回调里的 throw 变成未捕获异常,外层 try/catch 无法捕获

  • 回调嵌套:

    每一步依赖上一步时只能层层套入,层级越多错误判断重复越多

  • 串行:

    for 循环加 await,总耗时等于各任务延时之和,最大并发为 1

  • 并行:

    Promise.all 一次启动全部任务,总耗时接近最慢一个,并发数等于任务数

  • 并发上限:

    用 Set 记录在跑任务,Promise.race 等最快完成,再补进下一个

  • 结果顺序:

    按下标写回数组,不能按完成顺序追加

  • 选择依据:

    有依赖用串行,互不相干且量小用并行,有承载上限用限制并发

(本文为学习笔记整理)

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-11-08 19:50:23 HTTP/1.1 GET : http://h.sjds.net/a/578737.html
  2. 运行时间 : 0.078085s [ 吞吐率:12.81req/s ] 内存消耗:4,775.39kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=4207e150727ae0e2d3d6e8f98a37f41c
  1. /www/wwwroot/h.sjds.net/public/index.php ( 0.79 KB )
  2. /www/wwwroot/h.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /www/wwwroot/h.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /www/wwwroot/h.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /www/wwwroot/h.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /www/wwwroot/h.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /www/wwwroot/h.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /www/wwwroot/h.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /www/wwwroot/h.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /www/wwwroot/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /www/wwwroot/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /www/wwwroot/h.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /www/wwwroot/h.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /www/wwwroot/h.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /www/wwwroot/h.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /www/wwwroot/h.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /www/wwwroot/h.sjds.net/app/provider.php ( 0.19 KB )
  23. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /www/wwwroot/h.sjds.net/app/common.php ( 0.03 KB )
  27. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /www/wwwroot/h.sjds.net/config/app.php ( 0.95 KB )
  30. /www/wwwroot/h.sjds.net/config/cache.php ( 0.78 KB )
  31. /www/wwwroot/h.sjds.net/config/console.php ( 0.23 KB )
  32. /www/wwwroot/h.sjds.net/config/cookie.php ( 0.56 KB )
  33. /www/wwwroot/h.sjds.net/config/database.php ( 2.48 KB )
  34. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /www/wwwroot/h.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /www/wwwroot/h.sjds.net/config/lang.php ( 0.91 KB )
  37. /www/wwwroot/h.sjds.net/config/log.php ( 1.35 KB )
  38. /www/wwwroot/h.sjds.net/config/middleware.php ( 0.19 KB )
  39. /www/wwwroot/h.sjds.net/config/route.php ( 1.89 KB )
  40. /www/wwwroot/h.sjds.net/config/session.php ( 0.57 KB )
  41. /www/wwwroot/h.sjds.net/config/trace.php ( 0.34 KB )
  42. /www/wwwroot/h.sjds.net/config/view.php ( 0.82 KB )
  43. /www/wwwroot/h.sjds.net/app/event.php ( 0.25 KB )
  44. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /www/wwwroot/h.sjds.net/app/service.php ( 0.13 KB )
  46. /www/wwwroot/h.sjds.net/app/AppService.php ( 0.26 KB )
  47. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /www/wwwroot/h.sjds.net/vendor/services.php ( 0.14 KB )
  53. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /www/wwwroot/h.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /www/wwwroot/h.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /www/wwwroot/h.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /www/wwwroot/h.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /www/wwwroot/h.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /www/wwwroot/h.sjds.net/app/Request.php ( 0.09 KB )
  84. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /www/wwwroot/h.sjds.net/app/middleware.php ( 0.25 KB )
  86. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /www/wwwroot/h.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /www/wwwroot/h.sjds.net/route/app.php ( 1.72 KB )
  100. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /www/wwwroot/h.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /www/wwwroot/h.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /www/wwwroot/h.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /www/wwwroot/h.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /www/wwwroot/h.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /www/wwwroot/h.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /www/wwwroot/h.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /www/wwwroot/h.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /www/wwwroot/h.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /www/wwwroot/h.sjds.net/runtime/temp/c1d6e8c94b2c2fa10e259903674c804d.php ( 8.11 KB )
  140. /www/wwwroot/h.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000620s ] mysql:host=172.18.0.4;port=3306;dbname=h_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000819s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000377s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000366s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000526s ]
  6. SELECT * FROM `set` [ RunTime:0.000265s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000652s ]
  8. SELECT * FROM `article` WHERE `id` = 578737 LIMIT 1 [ RunTime:0.000397s ]
  9. UPDATE `article` SET `lasttime` = 1794138623 WHERE `id` = 578737 [ RunTime:0.001710s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000309s ]
  11. SELECT * FROM `article` WHERE `id` < 578737 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000449s ]
  12. SELECT * FROM `article` WHERE `id` > 578737 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000404s ]
  13. SELECT * FROM `article` WHERE `id` < 578737 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000611s ]
  14. SELECT * FROM `article` WHERE `id` < 578737 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000573s ]
  15. SELECT * FROM `article` WHERE `id` < 578737 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000932s ]
0.090897s