当前位置:首页>java>Rx.NET:用几行代码驯服异步编程的"野马"

Rx.NET:用几行代码驯服异步编程的"野马"

  • 2026-01-31 19:10:00
Rx.NET:用几行代码驯服异步编程的"野马"

在日常C#开发中,你是不是经常遇到这样的场景:用户在搜索框疯狂输入,每次输入都触发一次API调用;或者多个异步操作同时进行,结果却乱序返回,界面显示的数据"驴唇不对马嘴"?更糟糕的是,你写了一堆嵌套回调、状态机、线程同步代码,最后自己都看不懂了。

使用传统异步模式处理这类场景,代码量往往会膨胀3-5倍。但如果用Rx.NET,同样的功能只需要几行优雅的代码就能搞定。

读完这篇文章,你将掌握:✅ Rx.NET的核心思想与适用场景✅ 3个立即可用的实战案例(从入门到进阶)✅ 规避常见陷阱的最佳实践

咱们直接上干货,用最简单的Console应用展示Rx.NET的魔力。


💡 什么是Rx.NET?为什么它值得学习

🎯 一句话理解Rx

Rx.NET就是把异步数据源当作"可观察的集合"来处理,就像你用LINQ查询数据库一样自然。

传统的异步编程就像"被动接电话"——事件来了你得赶紧处理,代码分散在各个回调里。而Rx.NET则是"主动管理数据流"——你定义好规则,数据自动按你的要求流转。

🔥 三大核心优势

  1. 1. 组合性强:多个异步操作像搭积木一样组合
  2. 2. 声明式语法:关注"做什么"而非"怎么做"
  3. 3. 自动资源管理:订阅和取消订阅都帮你搞定

什么时候用Rx.NET合适:

✅ 适用场景:

  • • 多个异步操作需要组合:如用户输入防抖 + API调用 + 结果过滤
  • • 事件驱动的复杂逻辑:UI交互、实时数据处理
  • • 需要取消过期请求:搜索建议、自动完成
  • • 时间相关的操作:延迟、节流、采样
  • • 多数据源合并:同时处理多个异步数据流

❌ 不适用场景:

  • • 简单的单次异步调用(用async/await更简单)
  • • 很少异步操作的应用(学习成本 > 收益)
  • • 对性能极度敏感的场景(有轻微开销)

🚀 案例一:5行代码实现防抖搜索

😫 痛点场景

用户在搜索框输入时,每次按键都触发API调用,服务器压力山大,用户体验也差。传统做法需要手动管理Timer、清理旧请求,代码容易出错。

✨ Rx.NET解决方案

using System.Reactive.Linq;using System.Reactive.Subjects;namespaceAppRxNet{internalclassProgram    {staticvoidMain(string[] args)        {            Console.OutputEncoding = System.Text.Encoding.UTF8;            Console.WriteLine("🔍 模拟搜索框输入(输入'exit'退出)\n");// 创建一个Subject作为用户输入的数据源  var searchInput = new Subject<string>();// 核心逻辑:防抖 + 去重 + 过滤  var searchStream = searchInput                .Throttle(TimeSpan.FromMilliseconds(500))  // 500ms内无新输入才触发                  .DistinctUntilChanged()                     // 过滤连续重复值                  .Where(term => !string.IsNullOrWhiteSpace(term) && term.Length >= 2);// 订阅处理结果              searchStream.Subscribe(term =>            {                Console.WriteLine($"✅ 发起搜索请求: '{term}'");// 这里可以调用真实API              });// 模拟用户输入  while (true)            {var input = Console.ReadLine();if (input == "exit"break;                searchInput.OnNext(input);            }            Console.WriteLine("👋 程序结束");        }    }}

📊 效果对比

传统方式
Rx.NET方式
需要Timer管理
一行Throttle搞定
手动记录上次值
DistinctUntilChanged自动处理
代码30-50行
核心逻辑5行

⚠️ 踩坑预警

  1. 1. Throttle vs Debounce:Throttle是"等待静默期",Sample是"定时采样",别搞混了
  2. 2. 内存泄漏风险:长期运行的程序一定要记得Dispose订阅
  3. 3. 线程安全:Subject本身是线程安全的,但OnNext调用需要注意上下文

注意:这里看到是不是是事件订阅与发布。


🎯 案例二:优雅处理多个并发请求

😫 痛点场景

你需要同时调用3个API获取数据,传统方式要么用Task.WhenAll(无法控制顺序),要么手写状态机(复杂且易错)。

✨ Rx.NET解决方案

using System.Reactive.Linq;using System.Reactive.Subjects;namespaceAppRxNet{internalclassProgram    {staticvoidMain(string[] args)        {            Console.OutputEncoding = System.Text.Encoding.UTF8;            Console.WriteLine("🌐 并发请求示例\n");// 模拟三个异步API调用  var api1 = SimulateApiCall("用户信息"1000);var api2 = SimulateApiCall("订单列表"1500);var api3 = SimulateApiCall("推荐商品"800);// 方案1:等待所有结果(类似Task.WhenAll)              Console.WriteLine("📦 方案1: 等待所有结果");            Observable.Zip(api1, api2, api3, (u, o, r) => new { User = u, Orders = o, Recommendations = r })                .Subscribe(                    result => Console.WriteLine($"✅ 全部完成: {result.User}{result.Orders}{result.Recommendations}"),                    error => Console.WriteLine($"❌ 错误: {error.Message}"),                    () => Console.WriteLine("🏁 所有请求完成\n")                );            Console.ReadLine();// 方案2:谁快用谁(最快响应优先)              Console.WriteLine("📦 方案2: 最快响应优先");            Observable.Amb(api1, api2, api3)                .Subscribe(                    result => Console.WriteLine($"⚡ 最快返回: {result}"),                    () => Console.WriteLine("🏁 完成\n")                );            Console.ReadLine();// 方案3:按顺序逐个处理(Concat)              Console.WriteLine("📦 方案3: 按顺序执行");            Observable.Concat(api1, api2, api3)                .Subscribe(                    result => Console.WriteLine($"📝 按序返回: {result}"),                    () => Console.WriteLine("🏁 全部完成")                );            Console.ReadLine();        }// 模拟异步API调用  static IObservable<stringSimulateApiCall(string name, int delayMs)        {return Observable.FromAsync(async () =>            {await Task.Delay(delayMs);return$"{name}(耗时{delayMs}ms)";            });        }    }}

🔍 三种组合模式详解

操作符
场景
特点
Zip
需要所有结果才能继续
等待最慢的,结果配对
Amb
谁快用谁
只要最快的,其他取消
Concat
严格顺序执行
前一个完成才开始下一个

💡 实战技巧

在实际项目中,我经常这样用:

  • • Zip:用于加载页面需要的多个独立数据源(用户信息+权限+配置)
  • • Amb:用于多个镜像源下载同一个文件(CDN负载均衡)
  • • Concat:用于有依赖关系的流程(登录→获取Token→加载数据)

注意:这个是不是有点Task的感觉!


🛡️ 案例三:智能取消过期请求

😫 痛点场景

用户快速切换搜索词时,旧的请求还没返回,新的请求又发出了。如果不处理,可能导致界面显示的是旧结果。

✨ Rx.NET的魔法:Switch操作符

internalclassProgram{staticvoidMain()    {        Console.OutputEncoding = System.Text.Encoding.UTF8;        Console.WriteLine("🔍 智能搜索(自动取消过期请求)\n");        Console.WriteLine("提示:快速输入多个词,观察只有最后一个请求返回结果\n");var searchInput = new Subject<string>();// 核心逻辑:Switch会自动取消未完成的旧请求  var intelligentSearch = searchInput            .Throttle(TimeSpan.FromMilliseconds(300))            .DistinctUntilChanged()            .Select(term =>            {                Console.WriteLine($"🚀 发起请求: '{term}'");return SearchApi(term);  // 返回Observable              })            .Switch()  // 🔥 关键:自动取消旧请求,只保留最新的              .Subscribe(                result => Console.WriteLine($"✅ 收到结果: {result}"),                error => Console.WriteLine($"❌ 错误: {error.Message}")            );// 模拟用户快速输入  while (true)        {var input = Console.ReadLine();if (input == "exit"break;            searchInput.OnNext(input);        }        intelligentSearch.Dispose();        Console.WriteLine("👋 程序结束");    }// 模拟搜索API(随机延迟)  static IObservable<stringSearchApi(string term)    {return Observable.FromAsync(async () =>        {var delay = new Random().Next(5002000);            Console.WriteLine($"   ⏳ '{term}' 查询中... (预计{delay}ms)");await Task.Delay(delay);return$"'{term}' 的搜索结果";        });    }}

注意:Switch确保只有最后一个请求的结果会被处理,这个应用比较神奇。

⚙️ 底层原理

Switch的工作机制:

  1. 1. 每次收到新的Observable(内层序列)
  2. 2. 立即取消对旧Observable的订阅
  3. 3. 订阅新的Observable
  4. 4. 只有当前Observable的结果会被传递下去

🆚 对比另一种方案:TakeUntil

// 使用TakeUntil的替代方案  var searchStream = searchInput      .Throttle(TimeSpan.FromMilliseconds(300))      .DistinctUntilChanged()      .SelectMany(term =>           SearchApi(term).TakeUntil(searchInput)  // 新输入到来时取消当前请求      );  

Switch vs TakeUntil

  • • Switch:更简洁,语义清晰
  • • TakeUntil:更灵活,可以指定任意"取消信号"

🧩 核心操作符速查表

操作符
用途
典型场景
Throttle
防抖动
搜索框输入
DistinctUntilChanged
去除连续重复
过滤无效事件
Where
过滤
条件筛选
Select
转换
数据映射
SelectMany
展平嵌套
异步操作串联
Switch
切换最新
取消过期请求
Zip
配对组合
多数据源合并
Merge
合并流
多事件源统一处理

⚠️ 最佳实践与避坑指南

✅ 推荐做法

  1. 1. 及时Dispose订阅
using (var subscription = observable.Subscribe(...))  {  // 业务逻辑  // 自动清理  
  1. 2. 使用ObserveOn控制线程上下文
observable      .ObserveOn(SynchronizationContext.Current)  // 切换到UI线程      .Subscribe(data => UpdateUI(data));  
  1. 3. 善用冷热Observable
    • • 冷Observable:每次订阅都重新执行(如Observable.Range)
    • • 热Observable:共享数据源(如FromEventPattern)

❌ 常见错误

  1. 1. 忘记处理OnError
// 错误示范  observable.Subscribe(x => Console.WriteLine(x));  // 正确做法  observable.Subscribe(      x => Console.WriteLine(x),      ex => Console.WriteLine($"错误: {ex.Message}"),      () => Console.WriteLine("完成")  );  
  1. 2. Subject滥用Subject既是Observer又是Observable,容易造成混乱。优先使用Observable.Create或FromEvent。
  2. 3. 在Subscribe中执行重逻辑应该把复杂逻辑放在操作符链中,保持Subscribe的简洁。

🎯 三点总结

✅ Rx.NET把异步当数据流:用LINQ的思维处理异步,代码简洁3-5倍✅ 组合操作符威力巨大:Throttle、Switch、Zip等解决90%的异步场景✅ 记得资源管理:Dispose订阅、处理OnError、注意线程上下文


💬 互动讨论

问题1:你在项目中遇到过哪些"异步地狱"场景?用传统方式是怎么解决的?问题2:对比async/await,你觉得Rx.NET的优势和劣势分别是什么?

欢迎在评论区分享你的实战经验!如果这篇文章帮到你了,记得点赞+收藏,下次遇到异步问题时随时翻出来参考。


📚 进阶学习路径

  1. 1. 官方文档ReactiveX官网
  2. 2. 经典书籍:《Rx.NET in Action》
  3. 3. 实战项目:用Rx.NET重构一个现有的事件驱动模块
  4. 4. 高级主题:Scheduler调度、背压处理、错误重试策略

标签#CSharp#响应式编程#Rx.NET#异步编程#性能优化


💡 一句话金句

  1. 1. "异步编程不是回调地狱,而是优雅的数据流"
  2. 2. "Switch操作符:让过期请求自动消失的魔法"
  3. 3. "Rx.NET = LINQ + 时间维度 + 异步能力"

最新文章

随机文章

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