当前位置:首页>Linux>Linux 平台 C++ 热更新技术:从原理到实践

Linux 平台 C++ 热更新技术:从原理到实践

  • 2026-07-04 23:35:24
Linux 平台 C++ 热更新技术:从原理到实践

你有没有想过——一个跑在线上的游戏服务器,能不能在不重启的情况下修一个 bug?一个正在处理百万并发请求的后端服务,能不能在用户无感知的情况下升级某个模块?

答案是:可以,这就是热更新技术要做的事

C++ 作为一门编译型语言,天然不具备像 Python、JavaScript 那样的"改完代码直接跑"的能力。但在 Linux 平台上,借助操作系统的动态链接机制和内存管理能力,C++ 同样可以实现热更新——只是路线更多、坑也更多。

今天这篇文章,就从原理到实现方案,再到应用场景和优缺点对比,把 Linux 平台上的 C++ 热更新技术一次性讲清楚。


一、什么是热更新?

热更新(Hot Update / Hot Patch / Hot Reload),指的是在程序运行期间,不终止进程的情况下,对程序的代码逻辑、数据或配置进行修改并使之生效的技术。

打个比方:你的汽车正在高速行驶,热更新就是在不停车的情况下,换一个更高效的发动机零件——车还在跑,但性能已经变了。

与热更新容易混淆的几个概念先厘清一下:

  • 热修复(Hot Fix)
    :侧重于 bug 修复,通常改动量小,目标是"修完就生效"。
  • 热加载(Hot Load)
    :侧重于加载新的模块或资源(如新配置、新插件),不一定替换旧逻辑。
  • 热替换(Hot Swap)
    :侧重于把旧模块的逻辑替换为新模块的逻辑,旧模块被卸载。
  • 动态更新 / 在线更新
    :更宽泛的术语,有时也包含需要短暂停机的滚动更新。

本文统一使用热更新,涵盖以上所有场景。


二、Linux 平台 C++ 热更新的实现原理

C++ 是编译型语言,源码经过编译、链接后变成机器码,加载到内存后由 CPU 直接执行。

要在运行时替换逻辑,本质上要解决一个问题:

如何让进程在运行中,把内存里的一段旧机器码替换为新机器码,并让后续的执行流跳到新代码上去?

Linux 操作系统提供了几个关键机制,正是这些机制让热更新成为可能:

1. 动态链接与 dlopen/dlsym

Linux 的 ELF 可执行文件分两种:静态链接和动态链接。

动态链接的可执行文件在运行时会加载 .so(共享对象)文件,而 dlopen / dlsym 这组 API 允许程序在运行时主动加载新的 .so 文件,并查找其中的符号。

这是热更新最基础的操作系统支撑:新代码编译成 .so,旧进程在运行时把它加载进来

2. 符号重定位与 GOT/PLT

动态链接的程序调用外部函数时,并不直接跳到目标地址,而是通过 GOT(Global Offset Table) 和 PLT(Procedure Linkage Table) 这两层间接跳转:

GOT 是可以修改的——如果我们在运行时把 GOT 里某个函数的地址改成新函数的地址,那么所有通过 PLT 调用该函数的代码,都会自动跳到新函数上,这就是"函数级热替换"的核心原理。

3. 进程内存布局与 mprotect

Linux 进程的内存布局中,代码段(.text)通常是只读可执行的(R-X 权限,即 PROT_READ | PROT_EXEC,不可写)。

要直接修改代码段里的指令,需要先用 mprotect 把对应内存页的权限加上可写(从 R-X 改为 RWX,即 PROT_READ | PROT_WRITE | PROT_EXEC),写完新指令后再改回只读(R-X)。

这种方式很底层,也很危险——改错了指令进程直接崩溃,但在某些场景下(如单函数补丁),它却是最轻量的方案。

4. ptrace 与进程注入

ptrace 是 Linux 的进程跟踪机制,调试器(gdb)就是基于它实现的。

一个进程可以通过 ptrace attach 到另一个进程,修改其内存、寄存器,甚至注入新的代码段。

这种方式的权限要求高,但可以实现跨进程的热更新——补丁进程不需要是目标进程本身。

5. 信号与执行流中断

SIGUSR1 / SIGUSR2 等自定义信号,可以用来通知进程"该做热更新了"。

进程在信号处理器中设置一个标记,主循环检测到标记后,在安全的同步点执行加载新模块、替换逻辑等操作。注意:dlopen 等 API 不是 async-signal-safe 函数,不能在信号处理器中直接调用。


三、Linux 平台 C++ 热更新的实现方案

基于上述原理,业界演化出以下几条主流实现路线。

按"实现复杂度低 → 高","侵入性低 → 高"排列:

方案 A:动态库加载替换(dlopen + dlsym

思想:将需要热更新的模块编译成独立的 .so 文件。主程序通过 dlopen 加载该 .so,用 dlsym 查找模块入口函数并调用。需要更新时,dlclose 卸载旧 .so,再 dlopen 加载新 .so

实现骨架

优点

  • 实现简单,几十行代码就能跑起来。
  • 模块边界清晰——每个 .so 是独立的编译单元,更新只影响对应模块。
  • 不修改主程序代码段,安全性高。
  • Linux 原生支持,无需第三方库。

缺点

  • 模块必须通过接口类(虚函数)访问
    ——因为 dlopen 加载的新 .so 里类的符号名与旧 .so 不同,不能直接按符号名替换对象。工厂函数 + 虚函数是唯一的安全桥梁。
  • 全局/静态变量会丢失
    ——dlclose 卸载旧 .so 时,其全局和静态变量的内存被释放;新 .so 重新加载后,全局变量从头初始化。如果模块有需要持久化的状态,必须外部保存。
  • dlclose 不一定真正卸载
    ——如果旧模块的符号被其他 .so 引用,Linux 的动态链接器可能不会真正卸载它,导致新旧模块并存。
  • ABI 兼容性风险
    ——新 .so 必须与主程序使用相同的编译器版本和 ABI 约定;接口类的虚函数表顺序不能变(不能增删虚函数、不能改变基类顺序),否则虚调用会跳到错误的函数。
  • 不支持正在执行的函数热替换
    ——如果旧模块的某个函数正在被执行(栈帧还在),dlclose 后栈上的返回地址指向已卸载的代码段,进程会崩溃。

方案 B:GOT/PLT 劫持(函数级热替换)

思想:不改代码段,改 GOT 表。动态链接的程序调用外部函数时,通过 GOT 间接跳转。我们在运行时找到 GOT 中目标函数的条目,把地址改成新函数的地址,后续所有调用自动跳到新函数。

实现要点

优点

  • 不需要卸载/重载 .so,新旧代码可以共存。
  • 不影响正在执行的函数(只有后续调用才走新逻辑)。
  • 侵入性极低——不需要模块化改造,任何动态链接的函数都能被劫持。
  • 对进程的执行流影响极小,一个指针替换就完成。

缺点

  • 只对动态链接的函数有效
    ——静态链接的函数、内部函数(同一 .so 内的直接调用)不走 GOT,无法劫持。
  • GOT 修改涉及内存权限变更
    ——mprotect 操作页级权限,如果同一页上有其他 GOT 条目,可能影响其他函数的调用安全性。
  • 需要解析 ELF 结构
    ——找到 GOT 中目标函数的位置需要遍历 .rela.plt / .rel.dyn 段,实现复杂度不低。
  • 多线程安全隐患
    ——修改 GOT 和恢复只读之间,如果有其他线程调用同一 GOT 条目,可能读到半写入的地址。
  • 调试困难
    ——GOT 被修改后,gdb 的符号解析可能指向错误的地址。

方案 C:代码段直接补丁(mprotect + 机器码改写)

思想:最硬核的方案——直接修改进程代码段中的机器指令。把目标函数的前几条指令改成一个跳转(jmp),跳到新函数的地址。这和 kpatch / livepatch 内核热补丁的原理相同。

实现要点

优点

  • 最通用
    ——不管是动态链接还是静态链接、不管是外部函数还是内部函数,只要能拿到函数地址就能补丁。
  • 最轻量
    ——不需要加载新 .so,不需要工厂函数,不需要接口类。
  • 即时生效
    ——修改完成后,所有调用都会跳到新逻辑。
  • 内核级方案的同源技术
    ——kpatch / kGraft / livepatch 就是用的这套原理。

缺点

  • 极度危险
    ——改错了指令进程直接崩溃,没有回退机制(原始指令已被覆盖)。
  • 多线程安全隐患更大
    ——写入跳转指令期间,其他线程执行被覆盖区域的指令会 SIGILL。
  • 需要保存原始指令
    ——回滚必须事先备份被覆盖的原始指令。
  • 架构相关
    ——x86、ARM、RISC-V 的跳转指令格式不同,每种架构都要单独实现。
  • 函数长度限制
    ——如果目标函数本身小于跳转指令长度(x86-64 上 14 字节),补丁会溢出到下一个函数。
  • 与安全机制冲突
    ——PaX / Grsecurity 等加固内核禁止对代码段的 mprotect 写操作。

方案 D:信号驱动的模块替换

思想:方案 A 的变体,用信号(SIGUSR1 等)作为触发器。进程在信号处理器中标记"需要更新",主循环中检查标记并执行 dlclose + dlopen + 状态恢复。

实现要点

优点

  • 更新时机由外部信号触发,运维友好。
  • 信号处理器只做标记、主循环做实际操作,避免 async-signal-safe 问题。
  • 与方案 A 的模块化架构兼容。

缺点

  • 继承方案 A 的所有缺点(ABI 兼容性、全局变量丢失等)。
  • 信号可能丢失
    ——标准信号可能只递送一次。
  • 主循环必须有空闲检查点
    ——阻塞在 epoll_wait 等操作中时,检查可能迟迟不执行。
  • 状态保存/恢复复杂
    ——模块的全局状态需要序列化到外部存储。

方案 E:进程级热替换(优雅重启)

思想:不修改单个函数或模块,而是启动一个新进程,把旧进程的状态迁移过去,然后让旧进程优雅退出。这不是传统意义上的"热更新",但在很多场景下是最实用、最安全的方案。

实现要点

优点

  • 最安全
    ——新进程全新启动,没有旧进程的内存碎片、泄漏、状态残留。
  • 无 ABI 兼容性风险
    ——新进程甚至可以用不同编译器版本或不同语言。
  • 彻底清理
    ——旧进程退出后,所有资源被操作系统回收。
  • 运维成熟
    ——Nginx upgrade、Kubernetes Rolling Update 都是这套思路。

缺点

  • 不是"热更新"
    ——严格来说是"热迁移",有新旧进程并存的过渡期。
  • 状态迁移复杂
    ——需要把全部运行状态序列化传递,对有大量内存状态的服务成本高。
  • 过渡期处理复杂
    ——需要协调谁接收新请求、谁处理存量请求。
  • 有短暂服务能力下降
    ——过渡期间系统总资源占用翻倍。

四、方案对比总表

维度
方案 A:dlopen
方案 B:GOT劫持
方案 C:代码段补丁
方案 D:信号驱动
方案 E:优雅重启
实现复杂度
★☆☆☆☆
★★★☆☆
★★★★☆
★★☆☆☆
★★☆☆☆
侵入性
中(需模块化)
极低
中(需模块化+信号)
更新粒度
模块级
函数级
函数级
模块级
进程级
多线程安全
需协调卸载时机
有窗口风险
风险最大
需协调卸载时机
天然安全
正在执行函数
❌ 不能替换
✅ 不影响
⚠️ 有崩溃风险
❌ 不能替换
✅ 新进程
ABI 稳定性
要求严格
不涉及
不涉及
要求严格
不涉及
回滚能力
✅ 重载旧 .so
✅ 恢复 GOT
⚠️ 需备份原始指令
✅ 重载旧 .so
✅ 启动旧进程
适用架构
所有
x86/ARM
x86(需适配ARM)
所有
所有

五、热更新技术的应用场景

热更新技术在以下场景中特别有用:

1. 游戏服务器

游戏服务器是热更新需求最强烈的场景之一。

一个在线游戏服务器可能有数万玩家同时在线,重启意味着所有玩家断线、游戏进度丢失、玩家体验急剧下降。

  • 典型做法
    :方案 A(dlopen + 虚函数接口)或方案 D(信号驱动),游戏逻辑层编译成 .so,修复 bug 后替换对应 .so
  • 业界案例
    :网易游戏、腾讯游戏的服务端框架大多内置了 .so 热加载机制;Skynet(云风开源的 Lua 游戏服务框架)的热更新机制也被大量 C++ 游戏服务借鉴。

2. 高可用后端服务

金融交易、实时通信、流媒体等 7×24 小时运行的后端服务,停机一分钟都可能造成巨额损失。

  • 典型做法
    :方案 E(优雅重启)最常见——Nginx、HAProxy、Redis 的在线升级都是这套思路。
  • 偶尔使用方案 B/C
    :对关键单函数做紧急补丁(如修复一个死锁 bug),用 GOT 劫持或代码段补丁快速止血,后续再走正常升级流程。

3. 嵌入式 / IoT 设备

嵌入式设备往往部署在难以接触的物理位置(卫星、深海传感器、工厂车间设备),停机重启代价极高。

  • 典型做法
    :方案 C(代码段补丁)最常见——对单个函数做最小化修改,不需要加载新模块。
  • 业界案例
    :Linux 内核的 livepatch 机制(基于方案 C 的内核空间版本)已被大量嵌入式厂商采用;车载系统的 OTA 更新也借鉴了类似思路。

4. 开发调试加速

开发阶段频繁修改代码、重启进程、等待初始化,非常浪费时间。热更新可以让开发者"改完代码秒生效"。

  • 典型做法
    :方案 A——开发时把核心逻辑编译成 .so,修改后只需重新编译并重载 .so,主程序不重启。
  • 工具支持
    :Chromium 的 component build 就是把各模块编译成 .so,方便开发阶段快速迭代;gdb 的 call 命令可以在调试时通过 ptrace 注入函数调用,本质上属于前文原理第 4 节的 ptrace 进程注入机制。

5. 安全补丁紧急推送

当 0-day 漏洞被发现时,需要在最短时间内修复线上服务,传统"发版→部署→重启"流程可能需要数小时。

  • 典型做法
    :方案 C(代码段补丁)——最小改动、最快生效,一个函数级补丁就能堵住漏洞。
  • 业界案例
    :Linux 内核 livepatch 是官方支持的内核热补丁机制;Solaris 的 kernel patching、Windows 的 hotpatching 也是同类技术。

六、工程实践中的关键问题

不管选哪个方案,工程落地时都会碰到以下共性问题:

1. 状态保存与恢复

热更新的核心矛盾是:代码换了,但数据不能丢

  • 方案 A/D
    :模块卸载前,必须把模块内部的全局状态序列化到外部存储(主程序的成员变量、共享内存、文件),新模块加载后反序列化恢复。
  • 方案 E
    :旧进程退出前,把全部运行状态通过共享内存 / socket / 文件传给新进程。
  • 方案 B/C
    :不涉及状态丢失,因为只替换函数逻辑,数据仍在原内存位置。

建议:在设计时就区分"逻辑层"和"状态层",逻辑层尽量无状态或有明确的状态保存接口,状态层用独立的数据结构管理。

2. 多线程安全

几乎所有方案都面临多线程安全问题——在更新过程中,其他线程可能正在执行旧代码或访问旧数据。

  • 方案 A/D
    :卸载旧模块前,必须确保没有线程在执行旧模块的代码。做法包括:暂停所有工作线程、等待所有旧模块的函数调用返回、用读写锁保护模块访问。
  • 方案 B
    :修改 GOT 时需要原子写。x86-64 上对齐的 8 字节写入是原子的,GOT 条目通常是对齐的,因此单次 GOT 条目写入在 x86-64 上多数情况是原子的;但跨架构(如 32 位平台)或对齐不良时不保证。实际工程中仍应先暂停所有工作线程再修改,避免竞态窗口。
  • 方案 C
    :写入跳转指令的 14 字节期间,必须暂停所有可能执行目标函数的线程,否则正在执行被覆盖区域的线程会触发 SIGILL。此外,ARM / RISC-V 等架构修改代码后还需调用 __builtin___clear_cache 刷新指令缓存。
  • 方案 E
    :过渡期间需要用锁或原子变量协调新旧进程的请求接管。

建议:方案 A/D 最安全——在主循环的空闲检查点做更新,配合线程池的暂停/恢复机制。方案 B/C 需要 pause_all_threads() + resume_all_threads() 的配合。

3. ABI 稳定性

方案 A/D 对 ABI 稳定性要求最严:

  • 虚函数表顺序不能变——不能增删虚函数,不能调整虚函数的声明顺序,不能改变基类继承顺序。
  • 类的大小不能变——不能增删成员变量(除非加在末尾且新成员有默认值)。
  • 编译器版本需一致——不同版本的 GCC 对同一 C++ 代码可能生成不同的虚函数表布局。

建议:接口类设计时只暴露最少必要的虚函数;成员变量放在 Impl 类里,接口类只持有指针。这样接口类本身几乎不变,Impl 类可以随意演进。

4. 符号冲突与命名管理

多个版本的 .so 可能包含同名符号,导致链接混乱。

  • 建议
    :每个版本的 .so 使用版本化路径(如 module_v1.so / module_v2.so),工厂函数名保持不变(create_module),内部类名可以用命名空间隔离(如 module::v1::HotModuleImpl)。

5. 测试与回滚

热更新一旦失败,必须有快速回滚的手段。

  • 方案 A/D:回滚 = 重载旧版本 .so,前提是旧 .so 文件还在磁盘上。
  • 方案 B:回滚 = 恢复 GOT 中旧函数的地址,前提是旧地址被记录了。
  • 方案 C:回滚 = 把备份的原始指令写回代码段,前提是备份还在。
  • 方案 E:回滚 = 启动旧版本进程,前提是旧二进制还在磁盘上。

建议:每次热更新前,确保回滚所需的数据(旧 .so、旧符号地址、原始指令备份)都准备好了。


七、选型指南

最后给一个实战选型口诀:

一个常见组合是:开发阶段用方案 A 快速迭代,线上紧急补丁用方案 B/C 快速止血,日常升级用方案 E 稳妥推进


八、小结

维度
说明
核心问题
运行中的进程如何替换旧机器码、让执行流跳到新代码
关键机制
dlopen/dlsym、GOT/PLT、mprotect、ptrace、信号
五条路线
A. dlopen 模块替换;B. GOT劫持;C. 代码段补丁;D. 信号驱动模块替换;E. 优雅重启
最简单
方案 A — 适合模块化架构的日常热更新
最轻量
方案 B — 单函数补丁,不改代码架构
最通用
方案 C — 任何函数都能补丁,但风险最大
最安全
方案 E — 新进程启动,无 ABI 风险
工程关键
状态保存恢复、多线程安全、ABI 稳定性、回滚机制

C++ 热更新不像 Python 那样"改完就生效",它需要在编译型语言的约束下,借助操作系统机制做"外科手术级"的代码替换。

每条路线都有它的适用场景和代价——没有银弹,只有选对了路线的工程师。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-05 03:09:47 HTTP/2.0 GET : https://f.mffb.com.cn/a/503496.html
  2. 运行时间 : 0.236777s [ 吞吐率:4.22req/s ] 内存消耗:4,413.58kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=bb83087d156c814fa837bc78b4deb528
  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.001142s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001685s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000759s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000713s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001390s ]
  6. SELECT * FROM `set` [ RunTime:0.002697s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001527s ]
  8. SELECT * FROM `article` WHERE `id` = 503496 LIMIT 1 [ RunTime:0.004017s ]
  9. UPDATE `article` SET `lasttime` = 1783192187 WHERE `id` = 503496 [ RunTime:0.018356s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000707s ]
  11. SELECT * FROM `article` WHERE `id` < 503496 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001061s ]
  12. SELECT * FROM `article` WHERE `id` > 503496 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001433s ]
  13. SELECT * FROM `article` WHERE `id` < 503496 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.016299s ]
  14. SELECT * FROM `article` WHERE `id` < 503496 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.013855s ]
  15. SELECT * FROM `article` WHERE `id` < 503496 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.008910s ]
0.240565s