当前位置:首页>python>从 Electron+Python 转向 Tauri+Rust:桌面应用开发选型

从 Electron+Python 转向 Tauri+Rust:桌面应用开发选型

  • 2026-04-12 03:30:07
从 Electron+Python 转向 Tauri+Rust:桌面应用开发选型

从 Electron + Python 到 Tauri + Rust:为什么我转投它的怀抱开发桌面应用

我最近使用 Electron + React 构建了一个跨平台桌面应用,并在本地捆绑了一个 Python 运行时,运行了一个小型的 Flask 服务器来处理后端任务。这种架构让人感到熟悉、灵活,而且在初期极具生产力。

但随着项目推进,这种架构的维护成本变得越来越高,越来越难以找到继续使用它的理由。

应用确实能正常运行,但其运行模式比我期望的要沉重得多:我需要管理一个附属进程,处理端口问题,打包多个运行时,并确保整个安装和更新路径在不同平台上都能可靠运行。单独来看,这些问题都不算意外;但综合在一起,它们带来了极大的阻力,促使我重新评估整个技术栈。

这促使我转向了 Tauri + Rust。

在花了几天时间啃完《The Rust Book》并构建了我的第一个非玩具级的 Tauri 应用之后,我确信:对于这类桌面应用,Rust 和 Tauri 提供的模型比我最初采用的 Electron + Python 方案要好得多。

Rust 并非在第一天就能让你开发得更快。它要求更高的精确性、更明确的表达和更多的耐心。但作为回报,它给了我更小的交付产物、更少的活动部件、更强的正确性保证,以及一个感觉属于应用本身而非外部子系统的后端。

核心痛点并非 Electron 本身

需要澄清的是,Electron 并不是真正的问题所在。

Electron 非常好地解决了一个实际问题:它为 Web 开发人员提供了一条使用熟悉的前端工具发布桌面应用的捷径。如果应用主要由 UI 驱动,并且不需要太多原生或重度依赖后端的逻辑,这是一个非常务实的权衡。

在我的项目中,复杂性其实来源于以下技术的组合:

  • 使用 Electron 作为应用外壳
  • 使用 React 构建 UI
  • 捆绑了一个 Python 运行时
  • 运行一个监听 localhost 的 Flask 服务器
  • UI 与后端之间的跨进程通信
  • 在不同操作系统上可靠地打包这整套环境

这种架构带来了几个反复出现的痛点:

1. 进程生命周期管理

后端不仅仅是代码,它还包含另一个运行时和另一个进程。这意味着我必须仔细考虑启动、关闭、孤儿进程以及各种失败行为。

2. 端口管理

使用 localhost 进行进程间通信(IPC)是可行的,但它引入了一些很容易被低估的问题:选择端口、避免冲突、处理启动期间的竞态条件,以及确保 UI 能够可靠地发现后端服务。

3. 打包与分发的复杂性

打包桌面应用本身就是一项与平台高度相关的苦差事。额外引入 Python 运行时和后端进程,大大增加了脚本编写、测试和边缘情况处理的工作量。

4. 安装包体积与更新复杂性

Electron 本身已经是一个体型庞大的分发模型了。再加上 Python,使得应用变得更加臃肿,更新机制也变得不如我期望的那样优雅。

这些并非无法管理,很多团队都在这么干。但我渐渐发觉,自己花费了太多精力去维护架构本身,而不是用来推进产品研发。

为什么 Tauri + Rust 更具吸引力

Tauri 的核心吸引力在于其架构优势,而非外观表现。

在 Tauri 中,应用前端可以直接调用 Rust 命令。这在很多场景中移除了对独立 localhost 服务器的需求,将整个架构精简为更加简单的模型:

  • 一个应用
  • 一个原生后端
  • UI 与后端逻辑之间清晰的边界
  • 更少的运维问题渗透到开发中

这种转变立竿见影地解决了痛点。

更少的活动部件

最重要的改进在于减少了独立管理的组件数量。我不再需要将思维停留在“桌面应用”加上“挂载在桌面应用上的后端进程”这种割裂的模式上。整个应用程序变成了一个单一的、紧密连贯的实体。

更小巧、更具原生感的分发体验

Tauri 使用系统自带的 webview,而不是打包一个完整的 Chromium 实例,这极大地改变了分发配置。配合原生的 Rust 代码,最终的产物比附带额外运行时的 Electron 安装包要轻量得多。

无需外部编排的后端控制

在之前的技术栈中,虽然具备后端能力,但它们位于应用边界之外,总是时刻提醒我架构的复杂性。而在 Tauri 内部使用 Rust,文件 I/O、任务编排、子进程执行和系统集成感觉就像是应用程序的自然组成部分,而不是通过附属服务路由的特殊情况。

Rust 的价值不在于便捷,而在于信任

关于 Rust,我认识到的最重要的一点是,它的核心价值主张并不是立竿见影的开发便捷性。

而是信心。

Rust 的严苛程度是动态语言所不具备的。它强制你明确所有权、错误处理、值缺失以及状态转换。在早期,这可能会让人觉得是阻力。但在实践中,这是一种严格纪律的反馈。

那句著名的“只要能编译通过,就能正常运行”虽然不能说是绝对真理(没有哪种语言能保证应用逻辑的绝对正确),但相对于其他生态系统,Rust 确实将大量问题从运行期前置到了编译期。这在实质上改变了开发体验。

我在以下三个方面最深刻地体会到了这一点:

1. 错误处理绝非事后诸葛亮

Rust 让“易错性”变得显式化。你无法轻易忽视数据缺失或操作失败的可能性。类型系统会强制你处理这些问题。

一个小例子用于说明:

fn username_from_env() -> Option<String> {

   std::env::var("USER").ok()

}

fn greet() -> Result<String, std::io::Error> {

   let name = username_from_env().unwrap_or_else(|| "friend".into());

   Ok(format!("Hello, {name}!"))

}

这只是用于讨论的简单示例,并非应用的真实代码。

这里最重要的是思维模式的转变:

  • Option 让值的缺失变得明确
  • Result<T, E> 让失败的可能性变得明确
  • 语言鼓励在问题出现的地方就近处理这些情况

这种方式往往能产出极难被误解、且能更安全地进行扩展的代码。

2. 重构的感觉更加安全

在动态语言环境中,大规模重构通常依赖于测试、个人纪律和经验来揭示变更带来的影响。而在 Rust 中,编译器在重构过程中的参与度要高得多。当类型发生变化或所有权边界转移时,编译器会强制在整个代码库中进行同步修正。

这个过程有时并不轻松,但它极具价值。

3. 编译器虽然严苛,但极具建设性

Rust 编译器的诊断信息通常极具可操作性。它们不仅仅报告哪里出错了,还经常指出概念上的误区。这使得编译器感觉不再像是一个障碍,而更像是反馈循环的一部分。

代价:初期的开发速度会变慢

讨论 Rust 就不能不承认它带来的代价,我认为这是不可否认的。

对于许多任务,我用 Python 编写第一个可用版本的速度会更快。与 TypeScript 或 JavaScript 相比,在处理与 UI 强相关的逻辑时往往也是如此。Rust 需要更精确的类型约束、更明确的建模,以及更多地关注所有权和借用机制。

这意味着我目前会编写更多的代码,推进速度也更慢。

然而,我也不再需要花费大量时间去处理那一堆运行时的未知隐患。因此,这种权衡不能简单地概括为“Rust 更慢”。更准确的说法是:

Rust 将开发成本前置(左移)了。

你在实现阶段付出了更多,但换来的是后期更少的模棱两可。

对于包含非平凡后端逻辑的桌面软件而言,我越来越倾向于进行这种交换。

Tauri 解决了一个极其关键的实际痛点

Tauri 最直接的好处之一,就是用直接的命令调用取代了基于 localhost 的后端通信。

一个简单的示例如下:

#[tauri::command]

fn sum(a: i32, b: i32) -> i32 {

   a + b

}

fn main() {

   tauri::Builder::default()

       .invoke_handler(tauri::generate_handler![sum])

       .run(tauri::generate_context!())

       .expect("error while running tauri app");

}

这是文章使用的简化示例,并非真实源码。

它的重大意义体现在架构层面,而非语法层面。我不必再将我的桌面应用视为一个通过 localhost 与网络服务对话的前端,而是可以直接通过 Tauri 的命令系统暴露原生功能。这消除了多个层面的故障点和协调成本。

就我的用例而言,这让应用模型变得更加内聚。

最有效的思维转变

其中一个不太明显的调整不在技术层面,而在于代码风格。

由于我来自面向对象(OOP)主导的生态系统,我的第一直觉是用重度类继承或抽象优先的方式来构建 Rust 代码:到处使用 trait、过早设计层次结构、在业务领域尚未提出需求之前就设计通用接口。

这种直觉通常是错误的。

更有效的方式是采用一种更克制的风格:

  • 从最基础的函数开始
  • 保持状态局部且明确
  • 使用 enum 对业务域的变体进行建模
  • 大量使用模式匹配
  • 仅在能提高代码清晰度时才引入 trait,而不是将其作为默认选项

这种方法使代码库变得更简单、更符合语言习惯。它也减少了将在其他语言中的习惯生搬硬套到 Rust 上的诱惑,因为那些习惯并不能完美契合 Rust 的优势。

构建时间比你想象的更重要

影响我早期 Rust 体验的一个实际问题是编译时间。

当“编辑-构建-反馈”循环太慢时,保持高生产力会变得非常困难,尤其是在学习一门新语言的时候。我花了一些时间优化本地工作流,最终将内部循环调整到了一个非常理想的状态。

在此过程中,最有效的习惯是在开发期间频繁使用 cargo check。快速的类型检查和借用检查反馈消除了大量不必要的等待时间,让试错变得更加容易。

这并不能完全消除 Rust 的编译期成本,但极大地改善了日常开发体验。

Rust 在桌面应用中的绝对优势领域

经过这次经历,我非常清楚在什么情况下会认真考虑采用 Rust + Tauri。

当桌面应用具备以下需求时,我会强烈推荐它:

  • 包含实质性的本地后端逻辑
  • 涉及文件系统或进程管理
  • 需要结构化并发
  • 对性能和资源有严格的控制要求
  • 渴望比“UI 外壳 + 额外后端运行时”更简单的打包方式
  • 对正确性和重构安全性有极高的保障要求

但如果应用主要是作为远端 API 的前端壳,且不能从原生后端能力中获得太多收益,我就不会那么教条了。在这些场景下,Electron 可能仍然是更务实的选择,特别是对于那些围绕 Web 开发效率进行优化的团队而言。

因此,这并不是在论证 Rust + Tauri 无条件地更好。我的论点是:对于我的特定用例,它产出了一个更干净、更易维护的系统。

两个实用的编程模式

当我开始拥抱显式建模时,Rust 变得更加自然。例如,围绕资源的显式所有权设计:

struct Engine {

   cache_dir: PathBuf,

}

impl Engine {

   fn new(cache_dir: impl Into<PathBuf>) -> Self {

       Self { cache_dir: cache_dir.into() }

   }

   fn compute(&self, input: &str) -> Result<String, MyError> {

       Ok(format!("ok:{input}"))

   }

}

以及使用 enum 代替通用标志位来进行显式状态建模:

enum JobStatus {

   Queued,

   Running { started_at: Instant },

   Done { duration_ms: u128 },

   Failed(String),

}

这些片段仅用于说明,并非从生产代码中复制的。

它们展示了 Rust 所倡导的设计理念:让状态变得明确,让所有权可见,从设计层面杜绝意外产生无效状态的可能性。

这在不断演进的系统中能迅速带来回报。

给考虑相同转型的高级开发者的 5 条建议

如果你正准备从 Electron + Python,或者任何将桌面壳与独立本地后端运行时捆绑在一起的架构中抽身,以下是我完成这次转型后想给你的建议:

首先,评估架构,而不仅仅是语言

真正的问题通常不是“我应该学习 Rust 吗?”,而是“这个应用还需要由两个运行时协同工作吗?”

如果答案是否定的,那么 Tauri 的吸引力将大大增加。

其次,做好初期生产力下降的心理准备

Rust 确实有学习曲线,没有理由假装它不存在。这门语言最终会回报你的努力,但它绝不会免除这些努力。

第三,让编译器成为你的导师

与 Rust 抗争通常结局惨淡。仔细阅读诊断信息并调整你的心智模型,比试图将熟悉的模式强加给这门语言要有成效得多。

第四,不要过早进行过度抽象

当你从具体的函数和数据结构开始,然后仅在有帮助的地方进行后期抽象时,Rust 代码通常会变得更加清晰。

第五,尽早优化开发循环

诸如使用 cargo check、针对性进行局部重新构建,以及谨慎选择依赖项等工具习惯,对整体开发体验有着决定性的影响。

为什么我在这类项目中会坚守 Rust

Rust 给我的不是一个更快的原型设计周期,而是一个感觉更严谨、更具内聚性、更可预测的系统。

我不再需要花时间去协调运行时;不再需要去思考附属进程的行为;不再需要背负仅仅因为架构限制而存在的打包复杂性。

作为回报,我得到了:

  • 一个更精简的应用程序
  • 更清晰的后端边界
  • 更强的编译期保证
  • 一个在变更面前更值得信赖的代码库

这就是我义无反顾的原因。

并非因为 Rust 更容易;并非因为 Tauri 很时髦。而是因为,对于包含实质性本地逻辑的桌面应用而言,这个技术栈与我真正想要维护的系统模型完美契合。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-04-13 00:44:47 HTTP/2.0 GET : https://f.mffb.com.cn/a/484051.html
  2. 运行时间 : 0.229159s [ 吞吐率:4.36req/s ] 内存消耗:4,577.03kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d5950a56e30c3343217f396e02870712
  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.001173s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001605s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000648s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000557s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001204s ]
  6. SELECT * FROM `set` [ RunTime:0.000469s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001285s ]
  8. SELECT * FROM `article` WHERE `id` = 484051 LIMIT 1 [ RunTime:0.000975s ]
  9. UPDATE `article` SET `lasttime` = 1776012287 WHERE `id` = 484051 [ RunTime:0.011520s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000585s ]
  11. SELECT * FROM `article` WHERE `id` < 484051 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001053s ]
  12. SELECT * FROM `article` WHERE `id` > 484051 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001080s ]
  13. SELECT * FROM `article` WHERE `id` < 484051 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001387s ]
  14. SELECT * FROM `article` WHERE `id` < 484051 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.017870s ]
  15. SELECT * FROM `article` WHERE `id` < 484051 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002987s ]
0.233224s