当前位置:首页>python>拆解 uv:用 Rust 重写 Python 包管理器的工程奥秘

拆解 uv:用 Rust 重写 Python 包管理器的工程奥秘

  • 2026-07-04 02:43:37
拆解 uv:用 Rust 重写 Python 包管理器的工程奥秘

引言

如果你是一名 Python 开发者,大概率用过 pip、virtualenv、pyenv 这些工具。它们各司其职,却也各自为政——配置散落、速度堪忧、依赖冲突让人头疼。

2024 年以来,一个名为 uv 的工具横空出世。它由 Ruff 背后的团队 Astral 打造,用 Rust 编写,号称比 pip 快 10~100 倍。更关键的是,它用一个二进制文件替代了 pip、virtualenv、pyenv、pipx、poetry 等一整套工具链。

但"用 Rust 重写所以快"只是表面答案。最近一篇深度技术文章 "How uv Works Under the Hood" 从源码层面剖析了 uv 的工程架构,揭示了真正让它飞速运行的设计决策。本文将为你梳理其中的核心要点,帮助正在学习 Rust 的你理解这些设计背后的思路。


一、uv 是什么?一张表说清楚

uv 是一个极速的 Python 包与项目管理器,用 Rust 编写,在 GitHub 上已有超过 82k Star。它可以替代以下工具:

传统工具
uv 等价命令
pip install
uv pip install
pip-compile
uv pip compile
virtualenv / venv
uv venv
pyenv
uv python install
pipx run
uvx / uv tool run
poetry / rye
uv init + uv add

更值得注意的是,uv 的依赖解析器(resolver)已被指定为 Cargo 自身求解器的替代方案——这是来自 Rust 生态的重量级认可。


二、仓库结构:Rust 的 crate 怎么组织

克隆 uv 仓库后,你会看到核心代码全部在 crates/ 目录下。Rust 不允许 crate 之间存在循环依赖,因此 uv 团队将代码组织成一个有向无环图(DAG),每个 crate 只做一件事:

crates/
├── uv/               # CLI 入口,使用 clap 解析参数
├── uv-resolver/       # 依赖解析引擎(PubGrub 算法)
├── uv-installer/      # 将包安装到虚拟环境
├── uv-client/         # 异步 HTTP 客户端,访问 PyPI
├── uv-workspace/      # pyproject.toml 解析与工作区发现
├── uv-python/         # Python 版本管理
├── uv-cache/          # 全局内容寻址缓存
├── uv-distribution/   # Wheel 与 sdist 处理
├── uv-build/          # uv 自己的构建后端
├── uv-git/            # Git 依赖支持(基于 Cargo 的实现)
├── uv-platform-tags/  # Wheel 兼容标签匹配
├── uv-pep440/         # PEP 440 版本号解析
├── uv-pep508/         # PEP 508 依赖说明符解析
├── uv-types/          # 跨 crate 共享类型定义
└── ...

关键洞察:顶层的 uv(二进制入口)依赖所有 crate;底层的 uv-types 几乎不依赖任何东西。代码只能单向流动——这是 Rust 语言级别的强制约束,天然杜绝了循环依赖。


三、uv add requests 背后发生了什么?

当你执行 uv add requests 时,背后是一条精密的流水线。我们逐步拆解。

阶段 1:读取项目状态

uv-workspace 读取 pyproject.toml 文件,构建一个内存中的 Manifest——包括项目名、已有依赖、Python 版本约束、工作区成员等。

阶段 2:修改 pyproject.toml

uv 将 requests 加入依赖列表。这里使用的是 pyproject_mut 模块的外科手术式 TOML 编辑——只修改需要改的字段,不会破坏文件中的注释、缩进或手工排版。

阶段 3:依赖解析(核心)

这是最复杂的阶段。解析器回答的问题是:"哪个版本的每个包,能同时满足所有约束?"

解析完成后,pyproject.toml 会被更新为带版本下界的写法:

dependencies = [
    "requests>=2.32.3"
,  # 解析完成后回写版本下界
]

阶段 4:写入 uv.lock

解析结果被序列化为 uv.lock 文件。这是一个通用锁文件——一份 uv.lock 可以同时在 macOS、Linux 和 Windows 上使用。它通过环境标记(environment markers)记录所有平台的包信息,安装时 uv 会根据当前平台只选取匹配的包。

阶段 5:并发下载

uv-client 基于 reqwest 和 Tokio 实现异步 HTTP 客户端。与 pip 的串行下载不同,uv 会并行请求所有需要的包:

# pip:串行下载
fetch requests → 等待 → fetch urllib3 → 等待 → fetch certifi → 等待 → ...
总耗时 ≈ N × 单次往返时间

# uv:并发下载
fetch requests ─┐
fetch urllib3   ├── 全部并行
fetch certifi  ─┘
总耗时 ≈ 1 × 单次往返时间(大致)

这是 uv 在冷缓存场景下速度惊人的最大贡献者。

阶段 6:硬链接安装

"安装"通常意味着复制文件。而 uv 几乎不复制任何东西

uv-installer 使用硬链接(hard link)将全局缓存中的文件链接到 .venv/ 中。硬链接意味着两个目录条目指向磁盘上同一块物理数据,创建硬链接只是一次文件系统元数据操作,几乎零开销。

这就是为什么你能看到类似 Installed 43 packages in 208ms 这样的输出——208 毫秒是创建数千个目录条目的开销,而非复制数 GB 文件。


四、双线程架构:解析器的精妙设计

uv 解析器最令人赞叹的是它的双线程架构

问题

PubGrub 算法本质上是顺序同步的——每次只做一个决策,且每个决策依赖之前所有决策。你不能简单地并行化它。

但元数据获取——"Flask 有哪些版本?""Flask 3.1.0 依赖什么?"——是高度可并行的 I/O 操作。

解法:同步解析 + 异步 I/O

uv 的 resolve() 函数揭示了这一架构:

pub async fn resolve(self) -> Result<ResolverOutput, ResolveError> {
    let
 state = Arc::new(self.state);
    let
 provider = Arc::new(self.provider);

    // 创建通道:求解器 → 异步获取器(容量 300)

    let
 (request_sink, request_stream) = mpsc::channel(300);

    // 异步获取器运行在 Tokio 线程池上

    let
 requests_fut = state.clone()
        .fetch(provider.clone(), request_stream)
        .fuse();

    // PubGrub 求解器运行在**专用同步线程**上

    let
 solver = state.clone();
    let
 (tx, rx) = oneshot::channel();
    thread::Builder::new()
        .name("uv-resolver".into())
        .spawn(move || {
            // 在独立线程中同步执行求解

            let
 result = solver.solve(&request_sink);
            let
 _ = tx.send(result);
        })
        .unwrap();

    let
 resolve_fut = async move {
        rx.await.map_err(|_| ResolveError::ChannelClosed)
    };

    // 两个任务同时运行,任意一个完成(或报错)即终止

    let
 ((), resolution) = tokio::try_join!(requests_fut, resolve_fut)?;
    resolution
}

整体架构可以这样理解:

┌──────────────────────────────────────┐
│  专用同步线程:"uv-resolver"           │
│  运行 PubGrub 求解器(solve())       │
│  → 通过 mpsc::Sender 发送获取请求     │
│  → 通过 InMemoryIndex 接收结果        │
└──────────────┬───────────────────────┘
               │ mpsc 通道(容量 300)
               ▼
┌──────────────────────────────────────┐
│  Tokio 异步运行时                      │
│  运行 fetch()——处理请求流              │
│  发起并发 HTTP 请求                    │
│  将结果写入 Arc<InMemoryIndex>         │
└──────────────────────────────────────┘

设计的精妙之处在于关注点分离

  • • PubGrub 保持同步和简洁——它是一个紧凑的循环,有复杂的可变状态,不适合 async/await。
  • • 网络 I/O 保持异步和并发——Tokio 运行时可以同时处理上百个 HTTP 请求。
  • • Arc<ResolverState> 在两端之间安全共享。
  • • mpsc 通道容量为 300,提供背压机制——求解器最多排队 300 个请求后才会阻塞。

InMemoryIndex 是一个由 DashMap 支持的共享缓存。DashMap 是一种并发哈希表,允许多线程无锁读取。求解器线程从中读取,异步获取器往其中写入。


五、PubGrub:冲突驱动的依赖解析算法

为什么依赖解析很难

依赖解析在一般情况下等价于布尔可满足性问题(SAT),是 NP 完全的。包生态系统有成千上万的包,每个包有上百个版本。朴素的回溯法可能导致指数级的探索。

PubGrub 的核心思想:冲突驱动子句学习

uv 使用 pubgrub-rs——PubGrub 算法的 Rust 实现。PubGrub 由 Natalie Weizenbaum 在 2018 年为 Dart 包管理器发明,它是一种冲突驱动子句学习(CDCL)求解器。

传统做法:选一个版本 → 尝试 → 冲突 → 撤销 → 再试另一个。最坏情况下是指数级的。

PubGrub 做法:发现冲突时,学习并记录一条不兼容子句。例如:

  • • 解析器发现 a==2.0 和 b==3.0 无法共存(它们要求 c 的版本互相冲突)。
  • • PubGrub 记录不兼容性 {a==2.0, b==3.0}
  • • 此后任何同时包含两者的方案立即被剪枝,无需重新探索。

解析循环的六个步骤

  1. 1. 初始化:创建一个虚拟根包代表你的项目。
  2. 2. 选择最高优先级的未决包:优先处理 URL 依赖、有 == 约束的包、被标记为"高冲突"的包。
  3. 3. 选择版本:默认从最新到最旧;优先使用 uv.lock 中已有的版本(保持稳定性)。
  4. 4. 添加依赖:将所选版本的所有依赖加入未决集合,同时后台预取元数据。
  5. 5. 检测冲突:若发现冲突,记录不兼容子句,回溯并重试。
  6. 6. 重复或终止:所有包都有版本 → 成功;不兼容性传播到根节点 → 失败并生成解释。

冲突优先级启发式

源码中有一个关键常量:

/// 一个包累积多少次冲突后,我们重新排列优先级并回溯。
const
 CONFLICT_THRESHOLD: usize = 5;

场景:包 A 优先级高,先被决策。每次尝试包 B 的版本都因与 A 冲突而被拒绝。解析器遍历了 B 的所有版本,才意识到根因是 A 的版本选择——这很慢。

当 A 和 B 之间累积 5 次冲突后,uv 将 B 的优先级提升到 A 之上,回溯到 A 被决策之前,先尝试 B。先决策受限更多的包,能更快找到正确解

更好的错误信息

当解析失败时,PubGrub 能重建完整的原因链:

× 解析依赖时无解:
╰─▶ 因为 my-project 依赖 flask>=3.0,而 flask>=3.0 要求
     werkzeug>=3.0,所以 my-project 要求 werkzeug>=3.0。
     又因为 legacy-lib==1.0 要求 werkzeug<2.0,而 my-project
     依赖 legacy-lib==1.0,所以 my-project 的需求无法满足。

pip 只告诉你什么冲突了;PubGrub 告诉你为什么冲突,逐包追溯。


六、批量预取:boto3 优化

BatchPrefetcher 是一个针对"大量版本 + 频繁回溯"场景的专项优化。典型案例是 boto3 / botocore / urllib3。

问题:解析器尝试一个版本 → 获取元数据 → 发现冲突 → 尝试下一个版本 → 获取元数据 → 又冲突……对于 botocore 这种有上百个发布版本的包,这意味着上百次串行"获取→拒绝"循环。

解法:当解析器已经连续尝试失败 5 个版本后,BatchPrefetcher 会投机性地预取接下来 50 个兼容版本的元数据。

// 在尝试了 5、10、20、40 个版本后触发预取
// 初期不过于激进;之后每 20 个版本预取 50 个

// 足以饱和任务池

let
 do_prefetch = (num_tried >= 5 && previous_prefetch < 5)
    || (num_tried >= 10 && previous_prefetch < 10)
    || (num_tried >= 20 && previous_prefetch < 20)
    || (num_tried >= 20 && num_tried - previous_prefetch >= 20);

在冷缓存的 botocore 场景下,这可以将上百次串行往返压缩为几批并行请求。


七、分叉解析器:一份锁文件适用所有平台

大多数 Python 解析器生成的是平台特定的结果。uv 则生成通用锁文件

考虑这样的依赖:

numpy>=2,<3 ; python_version >= "3.11"
numpy>=1.16,<2 ; python_version < "3.11"

uv 的解析器检测到两条需求有不同的环境标记,于是将解析分叉为两个独立的子解析:

  • • 分叉 1python_version >= "3.11" → numpy 解析为 2.3.0
  • • 分叉 2python_version < "3.11" → numpy 解析为 1.26.4

两个结果都带着标记写入 uv.lock。在真实机器上安装时,uv 根据实际 Python 版本只安装匹配的包。

元数据一致性假设

uv 做了一个重要假设:同一版本的所有 wheel 文件具有相同的 METADATA

以 numpy 2.3.2 为例,它有 73 个 wheel(面向不同 Python 版本、操作系统和架构)。没有这个假设,uv 需要分别获取每个 wheel 的元数据——73 次网络请求。有了这个假设,只需从任意一个 wheel 获取元数据即可,73 次请求变成 1 次


八、全局缓存与硬链接

uv 的缓存是全局的、内容寻址的

~/.cache/uv/
├── wheels/        # 已解压的 wheel,按内容哈希索引
├── sdists/        # 源码分发包
├── builds/        # 从 sdist 构建的 wheel(首次构建后缓存)
├── interpreter/   # Python 解释器元数据
└── simple/        # PyPI Simple Index 的 HTTP 响应缓存

内容寻址意味着包按 SHA-256 哈希存储和检索,而非按名称或版本。两个项目使用同一版本的 requests,在磁盘上只有一份数据。完整性校验也是免费的——哈希本身就是键。

常用缓存管理命令:

uv cache dir    # 打印缓存位置
uv cache prune  # 移除不再被任何环境引用的条目
uv cache clean  # 清空所有缓存

九、为什么是 Rust?具体原因

"用 Rust 重写"不是审美偏好。以下是 Rust 对 uv 设计具体的支撑:

1. 同步求解器 + 异步 I/O 在同一进程中

Rust 的 thread::spawn 和 tokio::spawn 都是一等公民,Arc<T> 让共享状态在线程边界安全传递。在 Python 中,混合线程和异步是出了名的棘手;在 Go 中,goroutine 全是异步的。Rust 让你为每个子系统选择最合适的执行模型

2. 编译时数据竞争防护

uv 同时发起数百个并发网络请求。共享状态(InMemoryIndexunavailable_packages 等)被求解器线程和 Tokio 运行时同时访问。Rust 的所有权和借用规则使数据竞争成为编译错误。如果开发者不小心引入了未同步的共享写入,代码根本无法编译。

3. 无垃圾回收停顿

uv 的性能目标是亚秒级解析。Python、Java 和 Go 都有 GC,会不可预测地暂停执行。一次 20 毫秒的 GC 停顿在 200 毫秒的操作中就是 10% 的性能损失。Rust 的内存在每个值的作用域结束时确定性释放,零运行时开销。

4. 零成本 async/await

Tokio 在编译时将 async fn + .await 转换为状态机。每个 .await 点是一次状态转换,无堆分配、无虚拟分派——编译器生成的代码正是你用 C 手写状态机时会写的代码。这让 uv 可以使用数千个并发异步任务,而在其他语言中这样的开销是不可承受的。


十、从源码构建与贡献

如果你想动手探索 uv 的源码:

# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# 克隆仓库

git clone https://github.com/astral-sh/uv.git && cd uv

# 构建并运行本地版本

cargo run -- --version
cargo run -- pip install requests

# 运行测试

cargo install cargo-nextest
cargo nextest run

# 查看解析器日志

RUST_LOG=uv_resolver=debug cargo run -- lock -v

uv 的测试大量使用 insta 进行快照测试。一个典型的测试长这样:

#[test]
fn
 test_add() {
    // 创建一个 Python 3.12 的测试上下文

    let
 context = TestContext::new("3.12");
    // 运行 uv add requests 并对比快照

    uv_snapshot!(context.filters(), context.add().arg("requests"), @"");
}

团队将适合新手的问题标记为 good first issue,通常不需要深入了解解析器——比如改进错误信息、处理 TOML 解析的边界情况、添加缺失的 CLI 参数等。


总结

uv 的速度不是魔法,而是多个具体工程决策的累积效应

  1. 1. 算法层面:PubGrub 的冲突驱动子句学习(CDCL)替代朴素回溯,将指数级最坏情况压缩到可控范围。
  2. 2. 并发架构:双线程设计——专用同步线程跑 PubGrub,Tokio 异步运行时跑并发 I/O,通过 mpsc 通道通信。
  3. 3. 网络优化:并行下载所有包、批量预取元数据、元数据一致性假设大幅减少请求数。
  4. 4. 文件系统优化:硬链接安装避免复制数据,全局内容寻址缓存实现跨项目复用。
  5. 5. 通用锁文件:分叉解析器一次性为所有平台生成解决方案。
  6. 6. Rust 语言特性:编译时数据竞争防护、无 GC 停顿、零成本 async/await、直接系统调用。

对于正在学习 Rust 的你,uv 的源码是一个极佳的学习素材——它展示了如何在真实项目中运用 Rust 的所有权系统、并发原语、类型系统和 async/await,以构建一个高性能的生产级工具。


参考文章

1 How uv Works Under the Hood:https://noos.blog/posts/uv-how-it-works-under-the-hood/

书籍推荐

这本《Rust权威指南》中文版第二版是由 Rust 核心开发团队编写的权威学习资料,由中国 Rust 社区成员翻译。它适合所有希望评估、入门、提高和研究 Rust 语言的软件开发人员,被视为 Rust 开发工作的必读书目。

本书由浅入深地介绍了 Rust 语言的基础概念到独有实用工具的方方面面,涵盖了所有权、trait、生命周期、安全保证等高级概念,以及模式匹配、错误处理、包管理、函数式特性和并发机制等实用工具。书中包含三个完整的项目开发实战案例,手把手教读者从零开始开发 Rust 实践项目。

特别值得注意的是,本书已更新至 Rust 2021 版本内容,既能满足初学者系统学习需求,也适合有经验的开发者作为参考指南,是构建扎实 Rust 技能的最佳入口。

推荐阅读

  1.  Rust:横扫 C/C++/Go 的性能之王?

  2.  从 Rust 开发者视角看 C++:优缺点大揭秘

  3.  Rust vs Zig:新兴系统编程语言之争

  4.  Rust 异步编程必知设计模式:提升你的代码性能与可维护性

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 04:19:58 HTTP/2.0 GET : https://f.mffb.com.cn/a/486674.html
  2. 运行时间 : 0.250104s [ 吞吐率:4.00req/s ] 内存消耗:5,073.58kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=1692c663db16c89733ce4b5cbcb38d5c
  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.000776s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000579s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.025536s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000386s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000735s ]
  6. SELECT * FROM `set` [ RunTime:0.008790s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000707s ]
  8. SELECT * FROM `article` WHERE `id` = 486674 LIMIT 1 [ RunTime:0.001753s ]
  9. UPDATE `article` SET `lasttime` = 1783109998 WHERE `id` = 486674 [ RunTime:0.008761s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.004238s ]
  11. SELECT * FROM `article` WHERE `id` < 486674 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.007287s ]
  12. SELECT * FROM `article` WHERE `id` > 486674 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002991s ]
  13. SELECT * FROM `article` WHERE `id` < 486674 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.036243s ]
  14. SELECT * FROM `article` WHERE `id` < 486674 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.044210s ]
  15. SELECT * FROM `article` WHERE `id` < 486674 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002429s ]
0.254220s