当前位置:首页>java>大师级C/C++代码赏析:ZLMediaKit多线程非阻塞网络模型的“静”与“动”

大师级C/C++代码赏析:ZLMediaKit多线程非阻塞网络模型的“静”与“动”

  • 2026-02-05 00:53:10
大师级C/C++代码赏析:ZLMediaKit多线程非阻塞网络模型的“静”与“动”

AI时代,基础很重要。

只有基础扎实,才能驾驭AI这个强大的工具。

向大师学习,是夯实基础、精进技术的最好方式之一。

很多人第一次看 ZLMediaKit 的代码,会有一种“看不太懂,但很高级”的感觉。这种感觉并不是因为代码写得晦涩,而是用看似“多绕了一层”的设计实现了“在复杂中,保持秩序”。

前言

我第一次接触ZLMedia是在六、七年前参与开发一款人脸识别门禁产品,那时还没疫情,人脸识别门禁也不算火爆。当时加入这个开发团队我有很多不适应,因为那时我还是一个传统意义上的嵌入式linux应用开发:开发语言主要是C,少量C++;开发IDE是sourceinsight, 观察前端打印大多是通过串口。而这个人脸识别门禁的开发是基于ZLMedia框架,开发团队使用的语言是纯C++, 开发IDE是vs code, 观察日志打印也没有串口而是日志文件。尤其是这个ZLMedia框架代码,对于当时的我来说,确实很晦涩。为了补齐现代C++语言的短板,那一两年看了两部大部头书,一本是原版的《c++ primer》,一本是Marc Gregoire的《prefessional c++》,两本都是上千页,都看了两遍以上。

一边看书,一边看ZLMedia的源码,确实受益匪浅。如今我也被同化成了基本只写C++, 用vs code的AI应用开发。虽然那个项目之后没有再基于ZLM做开发,但平时写代码的很多小习惯都是当年向ZLMdedia学的,比如也喜欢用Ptr,函数入口处常用RAII小组件,函数内的逻辑代码块封装成lambda。很为大陆有这样的大佬存在而高兴。

一、ZLMediaKit的架构设计:从第一性原理出发的网络模型选择

1.1 传统的多线程阻塞模型的不足

传统的一个连接占用一个线程的模型(Thread-per-Connection)在应对高频并发连接时会面临诸多严峻挑战:

  • • 线程上下文切换开销呈指数增长
  • • 内存消耗巨大(每个线程栈通常需要1-2MB)
  • • 系统调用频繁,效率低下

传统的多线程阻塞模型不适用I/O密集型的流媒体服务,不能很好地应对流媒体服务的工程难题。

1.2 流媒体服务器的工程化难题

在一个流媒体服务器中,会同时存在:

  • • 大量长连接(RTSP / WebRTC / HTTP-FLV)
  • • 高频数据流(音视频帧)
  • • 复杂生命周期(鉴权、断线、重连、超时、关闭)

所以真正难的不是“如何监听 socket”,而是:

  1. 1. 线程之间如何协作
  2. 2. 对象什么时候创建、什么时候销毁
  3. 3. 谁拥有谁,谁依赖谁

如果这三点处理不好,epoll 写得再漂亮,也一定会恶化演变成:

  • • 难以定位的偶现崩溃
  • • 不可复现的死锁
  • • 无法扩展的新需求

所以ZLMediaKit 的多线程模型,本质上是一个复杂度隔离系统

1.3 核心设计原则

原则1:让I/O线程专注于I/OI/O线程只做三件事:

  • • 接收数据就绪事件
  • • 执行非阻塞读写
  • • 将完整数据包传递给工作线程

原则2:计算与I/O分离

  • • 解码、转码、协议解析等CPU密集型任务
  • • 必须与网络I/O在逻辑和物理上分离

原则3:无锁或最小化锁的设计

  • • 线程间通信优先选择无锁队列
  • • 必须用锁时,确保锁粒度极小

二、架构全景:四层线程模型

2.1 线程层次划分的艺术

ZLMediaKit的多线程模型可以抽象为四个逻辑层次:

┌─────────────────────────────────────────┐│  事件分发层 (EventDispatcher)           │ ← 使用epoll/kqueue/select│  (单线程或少量线程)                     │├─────────────────────────────────────────┤│  I/O工作层 (IOWorker)                   │ ← 执行实际非阻塞I/O│  (线程数=CPU核心数)                     │├─────────────────────────────────────────┤│  业务处理层 (WorkThread)                │ ← 处理协议、音视频帧│  (线程池,可配置大小)                   │├─────────────────────────────────────────┤│  定时任务层 (TimerThread)               │ ← 处理超时、心跳│  (专用线程)                             │└─────────────────────────────────────────┘

2.2 核心代码剖析:EventPoller的线程模型实现

// src/Network/Socket.h 中的关键抽象class EventPoller : public std::enable_shared_from_this<EventPoller> {public:    // 单例模式管理所有EventPoller实例static EventPollerPool& Instance();    // 每个EventPoller绑定一个系统线程void runLoop(bool blocked = true);private:    // 关键数据结构:事件循环    std::unique_ptr<EventLoop> _loop;    // 定时器管理    TimerManager _timer_manager;    // 异步任务队列(线程安全)    TaskExecutor _async_task_queue;    // 核心事件处理循环void handleEvents(int timeout_ms);};

每一个 EventPoller 对应一个系统线程,其内部运行着一个 epoll 或 select 循环。

// 伪代码展示其核心循环void EventPoller::runLoop(){    while (!_exited) {        int ret = epoll_wait(_epoll_fd, events, max_events, timeout);        for (int i = 0; i < ret; ++i) {            auto fd = events[i].data.fd;            // 触发 fd 绑定的回调函数            handleEvent(fd, events[i].events);        }        // 处理跨线程投递的任务        executePendedTasks();    }}

EventPoller同时承担了三个角色:

  1. 1. IO 事件循环(epoll)
  2. 2. 异步任务队列(runInLoop / async)
  3. 3. 对象生命周期的“安全区”

EventPoller的设计亮点:

  1. 1. 资源绑定:每个EventPoller实例固定绑定一个OS线程,避免线程切换开销
  2. 2. 职责单一:每个EventPoller只处理自己关心的事件集
  3. 3. 负载均衡:当一个新的 TcpServer 接收到连接请求时,它会调用 EventPollerPool::getPoller()通过哈希算法等策略分配到不同的EventPoller

2.3 一个重要但容易忽略的设计决策

在 ZLMediaKit 中,你会发现大量代码都遵循一个隐含规则:

对象只在所属 EventPoll 线程中被真正操作

这不是靠 mutex 实现的,而是靠:

  • • 把“可执行逻辑”投递给 EventPoll
  • • 用任务队列而不是直接跨线程调用

这背后是一个非常成熟的工程判断:

锁不是免费的,而“线程归属”是一种更高维度的同步方式。

三、模式应用

3.1 经典Reactor模式的变体实现

ZLMediaKit没有简单照搬Reactor模式,而是根据流媒体特性进行了深度优化:

// 简化的主Reactor实现逻辑class MainReactor {public:void start(){        // 1. 创建监听socket        _acceptor = createAcceptor(port);        // 2. 注册到EventPoller        _poller->addEvent(_acceptor.fd(),                          Event_Read,                          [this](int event) {            this->onAccept();        });        // 3. 启动I/O工作线程池        _io_workers.start();    }private:void onAccept(){        // 非阻塞accept        while (auto conn = _acceptor.accept()) {            // 关键决策点:选择哪个I/O Worker?            auto worker = selectIOWorkerByHash(conn.fd());            // 将连接迁移到选中的I/O Worker线程            worker->addConnection(std::move(conn));        }    }};

3.2 多Reactor协作模式

ZLMediaKit采用了多Reactor多线程变体:

  • • MainReactor:单线程,只处理新连接建立
  • • SubReactor:多个,每个对应一个IOWorker线程
  • • WorkThread池:处理业务逻辑,与I/O完全解耦

这种设计的优势在于:

  1. 1. 连接建立不会阻塞已有连接处理
  2. 2. I/O操作均匀分布到多个CPU核心
  3. 3. 业务处理能力可线性扩展

3.3 共享从属模式:智能指针与弱引用(Shared_from_this)

在异步网络中,最怕的是“回调对象已销毁”。ZLM 大量使用了 std::enable_shared_from_this

每当一个异步操作(如异步写入)被触发时,Lambda 闭包会捕获一个 weak_ptr 或 shared_ptr这保证了在事件触发时,对象依然有效;或者在对象销毁后,回调能自动跳过逻辑,优雅地解决了多线程下的生命周期管理难题。

3.4 抽象与多态:Session 对象的生命周期

ZLM 将具体的协议处理抽象为 Session

  • • TcpServer 负责监听和产生 Socket 对象。
  • • Socket 对象被分配到某个 EventPoller
  • • EventPoller 触发事件后,通过 Socket 调用绑定的 Session 的 onRecv

这种层层递进的抽象,使得 ZLM 能够同时支持 RTSP、RTMP、HTTP、WebSocket 而不显得臃肿。

四、无锁编程:线程间通信

4.1 ZLMediaKit 的线程角色划分

典型配置中,ZLMediaKit 会存在:

  • • IO EventPoll 线程池
  • • 工作线程池
  • • 定时器线程

但它们的职责边界非常清楚:

线程类型
只做什么
坚决不做什么
IO线程
网络事件、调度
重计算、阻塞操作
工作线程
业务处理
操作 socket
定时线程
时间驱动
业务逻辑

4.2 生产者-消费者模式的现代化实现

// 线程间任务传递的无锁队列实现(简化版)template<typename T>class LockFreeTaskQueue {public:    // 多生产者单消费者场景优化bool push(T&& task, bool front = false){        // 使用内存序relaxed减少同步开销        auto tail = _tail.load(std::memory_order_relaxed);        // 无锁CAS操作        while (!_tail.compare_exchange_weak(            tail,             tail + 1,            std::memory_order_acq_rel,            std::memory_order_relaxed)) {            // 忙等但无系统调用开销        }        // 写入任务数据        _buffer[tail % CAPACITY] = std::move(task);        return true;    }private:    // 环形缓冲区    std::array<T, CAPACITY> _buffer;    // 原子计数器    std::atomic<uint64_t> _head{0};    std::atomic<uint64_t> _tail{0};};

4.3 数据所有权的高效转移

在ZLMediaKit中,数据包在线程间的传递采用了移动语义+智能指针的组合:

// 数据包在线程间传递的典型模式class Packet {public:    using Ptr = std::shared_ptr<Packet>;    // 关键:确保数据只在一个线程中被处理void processOn(ThreadPool& pool){        auto self = shared_from_this();        // 将任务提交到指定线程池        pool.async([self]() {            // 此时数据包的所有权已经转移            self->doProcess();        });        // 当前线程不再访问self    }};

五、性能优化:从毫秒到微秒的极致追求

5.1 内存池的定制化实现

流媒体服务器频繁分配/释放内存,ZLMediaKit实现了专用的内存池:

class MediaBufferPool {public:    // 针对不同大小的音视频帧优化static char* obtain(size_t size){        if (size <= SMALL_BLOCK) {            return SmallBlockPool::instance().alloc();        } else if (size <= MEDIUM_BLOCK) {            return MediumBlockPool::instance().alloc();        } else {            // 大块内存直接使用系统分配            return new char[size];        }    }    // 内存对齐优化(CPU缓存友好)static constexpr size_t align_size(size_t size){        const size_t alignment = 64; // 缓存行大小        return (size + alignment - 1) & ~(alignment - 1);    }};

5.2 零拷贝优化技术

在关键路径上,ZLMediaKit大量使用零拷贝技术:

  1. 1. 写时复制(CoW):协议解析时避免内存复制
  2. 2. 内存映射:文件发送时使用sendfile系统调用
  3. 3. 缓冲区共享:多个会话间共享解码后的视频帧

六、可复用模式提炼:从ZLMediaKit学到的工程实践

6.1 模式一:分层线程模型

// 可复用的分层线程架构模板template<typename IOHandler, typename Worker>class LayeredThreadModel {public:void setup(size_t io_threads = std::thread::hardware_concurrency(),               size_t worker_threads = 4){        // 1. 创建I/O层        for (size_t i = 0; i < io_threads; ++i) {            _io_pool.emplace_back([this] {                EventLoop loop;                IOHandler handler;                loop.run(&handler);            });        }        // 2. 创建工作层        _worker_pool.resize(worker_threads);    }    // 连接分发策略void dispatchConnection(Connection conn){        // 一致性哈希确保同一连接的I/O在同一线程        size_t idx = hash(conn.id()) % _io_pool.size();        _io_pool[idx].post([conn]() mutable {            conn.handleIO();        });    }};

6.2 模式二:基于事件的任务调度

// 通用的事件驱动任务调度器class EventDrivenScheduler {public:template<typename F>    void scheduleOnEvent(int fd, EventType type, F&& func){        // 注册事件回调        _poller->addEvent(fd, type, [func = std::forward<F>(func)]() {            // 事件触发时在I/O线程执行            func();            // 如果需要CPU计算,转移到工作线程            if (needsComputation()) {                WorkerPool::instance().submit(std::move(func));            }        });    }};

七、工程决策:为什么这样设计?

7.1 权衡的艺术

  1. 1. 线程数选择:为什么I/O线程数等于CPU核心数?
    • • 超过核心数会增加上下文切换开销
    • • 现代网卡支持多队列,可与CPU核心绑定
  2. 2. 缓冲区大小:为什么是64KB而不是更大?
    • • 考虑CPU缓存命中率(L2 Cache通常256KB-1MB)
    • • 平衡延迟与吞吐量
  3. 3. 超时设置:为什么心跳间隔是10秒?
    • • 兼顾连接保活与服务器压力
    • • 符合大多数NAT会话超时时间

7.2 适应性的设计

ZLMediaKit的架构体现了优秀的适应性:

  • • 可插拔的事件循环:支持epoll、kqueue、select
  • • 可扩展的协议支持:RTSP、RTMP、HLS、WebRTC统一处理
  • • 可配置的线程模型:根据部署环境调整

结语

通过剖析ZLMediaKit的多线程非阻塞网络模型,我们看到的不仅是一套高效的代码实现,更是一种严谨的工程思维:

  1. 1. 从问题本质出发:理解流媒体服务的核心是I/O密集而非计算密集
  2. 2. 平衡的艺术:在简单与复杂、性能与可维护性之间找到最佳平衡点
  3. 3. 模式但不模式化:灵活运用设计模式而不被其束缚
  4. 4. 数据驱动优化:每个性能决策都有profiling数据支持

ZLMediaKit的代码也告诉我们:大师级的代码不在于用了多么玄学的语法,而在于对“资源控制”和“逻辑解耦”的深刻理解。它通过 EventPoller 锁定了运行环境,通过 Socket 抽象了通信底座,通过 Session 隔离了业务协议。这种结构让复杂的流媒体转发变得像流水线一样清晰。

扩展阅读

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-07 21:47:11 HTTP/2.0 GET : https://f.mffb.com.cn/a/471940.html
  2. 运行时间 : 0.232093s [ 吞吐率:4.31req/s ] 内存消耗:4,702.52kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d0f0643f3faea750db92a54a47c45ebc
  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.000594s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000621s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001798s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000534s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000666s ]
  6. SELECT * FROM `set` [ RunTime:0.007532s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000663s ]
  8. SELECT * FROM `article` WHERE `id` = 471940 LIMIT 1 [ RunTime:0.022847s ]
  9. UPDATE `article` SET `lasttime` = 1770472031 WHERE `id` = 471940 [ RunTime:0.000530s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000966s ]
  11. SELECT * FROM `article` WHERE `id` < 471940 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.016014s ]
  12. SELECT * FROM `article` WHERE `id` > 471940 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.024783s ]
  13. SELECT * FROM `article` WHERE `id` < 471940 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.031055s ]
  14. SELECT * FROM `article` WHERE `id` < 471940 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.035231s ]
  15. SELECT * FROM `article` WHERE `id` < 471940 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.015423s ]
0.234009s