乐于分享
好东西不私藏

iOS 底层深度解析:RunLoop 凭什么成为 App 的“心脏起搏器”?

iOS 底层深度解析:RunLoop 凭什么成为 App 的“心脏起搏器”?

全文共分为七大章节,从背景由来、模型剖析、源码解读、运行流程、实战应用、调试工具到面试题总结,建议先收藏,慢慢消化。

很多 iOS 开发者写了几年代码,对 RunLoop 的印象可能还停留在:

“就是那个让程序不死的死循环。”

“滑动的时候 NSTimer 会停,加个 CommonModes 就好了。”

但这些理解太浅了。为什么 RunLoop 能让线程休眠却不占 CPU?它是如何优雅地处理触摸、网络、定时器的?为什么 AutoreleasePool 的释放时机和 RunLoop 有关?

今天,我们就把 RunLoop 从黑盒拆成白盒。

一、背景由来:从 C 语言的 return 0 到 iOS 的“永远在线”

1.1 命令行程序 vs GUI 程序

我们学编程的第一个 C 程序:

#include<stdio.h>intmain(){    printf("Hello, World!\n");    return 0// 程序执行完毕,退出}

这段代码执行完 printf后,进程就结束了。这是典型的 “执行-退出” 模型。

但 iOS App 不一样。你点击 App 图标后,它不会自己退出,而是一直待在那里,等你触摸、滑动、输入。这是一个 “事件驱动” 模型。

1.2 iOS App 的启动入口:UIApplicationMain

打开任何一个 iOS 项目的 main.m 文件,你会看到:

int main(int argc, char * argv[]) {    @autoreleasepool {        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));    }}

      UIApplicationMain 函数做了三件核心事情:

1. 创建 UIApplication单例。

2. 创建 AppDelegate实例并赋值给 UIApplication。

3. 开启主线程的 RunLoop。

这个函数一旦调用,就永远不会返回(除非 App 被系统杀死)。它内部启动了一个 RunLoop,让主线程进入“等待-处理-休眠”的无限循环中。

1.3 如果没有 RunLoop 会怎样?

我们做个实验:在子线程执行一个任务,任务结束后线程就销毁了。

let thread = Thread {    print("子线程开始执行任务")    // 任务执行完毕    print("子线程任务结束")}thread.start()

输出:

子线程开始执行任务 子线程任务结束

线程完成任务后自动退出。如果我们想让这个线程一直活着,随时接收任务呢?

let thread = Thread {    print("子线程启动")    // 开启 RunLoop,让线程永远不退出    RunLoop.current.add(Port(), forMode: .default)    RunLoop.current.run()    print("这行代码永远不会执行")}thread.start()

这时候线程就不会退出了,它会一直等待消息。这就是 RunLoop 最核心的能力:线程保活

二、RunLoop 核心模型:五大组件的协同作战

RunLoop 并不是一个简单的 while 循环,它是一个由五个核心组件构成的精密系统。

组件

C 语言类型

作用

RunLoop

CFRunLoopRef

管理线程事件循环的总控制器

Mode

CFRunLoopModeRef

运行模式,决定了当前循环监听哪些事件

Source

CFRunLoopSourceRef

事件源,分为 Source0 和 Source1

Timer

CFRunLoopTimerRef

基于时间的触发器

Observer

CFRunLoopObserverRef

监听 RunLoop 各个阶段的状态变化

我们打开苹果开源的CoreFounation源码(CFRunLoop.c),可以看到 RunLoop 的核心数据结构:

struct __CFRunLoop {    CFRuntimeBase _base;    pthread_mutex_t _lock;          // 锁,用于保护数据结构    __CFPort _wakeUpPort;           // 唤醒端口,用于内核唤醒    Boolean _unused;    volatile _per_run_data *_perRunData; // 每次运行重置的数据    pthread_t _pthread;             // 对应的线程    uint32_t _winthread;    CFMutableSetRef _commonModes;   // 标记为 Common 的 Mode 集合    CFMutableSetRef _commonModeItems; // CommonMode 共享的 Source/Timer/Observer    CFRunLoopModeRef _currentMode;  // 当前运行的 Mode    CFMutableSetRef _modes;         // 所有的 Mode 集合    // ...};

RunLoop 和线程是一一对应的,通过一个全局字典__CFRunLoops

 来管理:
// 获取当前线程的 RunLoop 的内部实现(简化版)CFRunLoopRef CFRunLoopGetCurrent(void) {    // 从线程局部存储(TLS)中获取 RunLoop 对象    CFRunLoopRef loop = (CFRunLoopRef)pthread_getspecific(__CFRunLoopKey);    if (!loop) {        // 如果不存在,则创建一个新的        loop = _CFRunLoopCreate();        pthread_setspecific(__CFRunLoopKey, loop);    }    return loop;}

三、RunLoop 核心机制深度解析

3.1 Mode:工作模式的奥秘

RunLoop 在任一时刻只能运行在一个 Mode 下,切换 Mode 必须退出当前循环。

struct __CFRunLoopMode {    CFRuntimeBase _base;    pthread_mutex_t _lock;    CFStringRef _name;                      // Mode 名称    Boolean _stopped;    CFMutableSetRef _sources0;              // Source0 集合    CFMutableSetRef _sources1;              // Source1 集合    CFMutableArrayRef _observers;           // Observer 数组    CFMutableArrayRef _timers;              // Timer 数组    // ...};

苹果预定义了五种 Mode,但公开给我们用的主要是这几种:

Mode

说明

NSDefaultRunLoopMode

kCFRunLoopDefaultMode

默认模式,App 空闲时处于此模式

UITrackingRunLoopMode

UITrackingRunLoopMode

UI 追踪模式,滑动 ScrollView 时切换

NSRunLoopCommonModes

kCFRunLoopCommonModes

伪模式,只是一个标记集合

GSEventReceiveRunLoopMode

-

接收系统事件(私有)

UIInitializationRunLoopMode

-

App 启动时的第一个 Mode(私有)

经典面试题:NSRunLoopCommonModes 是真正的 Mode 吗?

不是。它只是一个字符串集合,你可以将多个 Mode 标记为“Common”。当 RunLoop 运行在任何一个被标记为 Common 的 Mode 下时,注册在NSRuLoopCommonModes下的Source/Timer/Observer都会被处理。

源码实现:

void CFRunLoopAddCommonMode(CFRunLoopRef rl, CFStringRef modeName) {    // 将 modeName 添加到 _commonModes 集合中    CFSetAddValue(rl->_commonModes, modeName);    // 将该 Mode 下的所有 Item 同步到 _commonModeItems 中}

3.2 Source:事件驱动的源头

Source 是 RunLoop 的数据输入源,分为两类:

Source0:手动触发

  • 只包含一个回调函数指针,不能主动唤醒 RunLoop。

  • 需要先调用 CFRunLoopSourceSignal(source) 标记为待处理,然后调用 CFRunLoopWakeUp(runloop) 手动唤醒。

  • 典型场景:触摸事件、performSelector:onThread:...

// 创建 Source0 的简化演示var context = CFRunLoopSourceContext()context.perform = { (info) in    print("Source0 被触发了")}let source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0&context)CFRunLoopAddSource(CFRunLoopGetCurrent(), source, .defaultMode)// 触发CFRunLoopSourceSignal(source)CFRunLoopWakeUp(CFRunLoopGetCurrent())

Source1:内核触发

  • 包含一个 Mach Port 和一个回调函数。

  • 由内核或其他线程通过 Mach Port 发送消息触发,能自动唤醒 RunLoop。

  • 典型场景:网络数据到达、硬件事件、GCD 的 Main Queue

Source1 是 RunLoop 能够休眠并被唤醒的关键,因为它依赖 Mach Port与内核通信。

3.3 Mach Port 与休眠机制

RunLoop 休眠时并不是调用 sleep(),而是调用 mach_msg()系统调用

// CFRunLoopRun 的核心代码(简化)static int32_t __CFRunLoopRun(CFRunLoopRef rl, CFRunLoopModeRef rlm, ...) {    do {        // 1. 通知 Observer:即将处理 Timer/Source        __CFRunLoopDoObservers(rl, rlm, kCFRunLoopBeforeTimers);        __CFRunLoopDoObservers(rl, rlm, kCFRunLoopBeforeSources);        // 2. 处理 Blocks        __CFRunLoopDoBlocks(rl, rlm);        // 3. 处理 Source0        if (__CFRunLoopDoSources0(rl, rlm)) {            __CFRunLoopDoBlocks(rl, rlm);        }        // 4. 如果有 Source1 待处理,跳转到处理步骤        if (__CFRunLoopServiceMachPort(dispatchPort, &msg, ...)) {            goto handle_msg;        }        // 5. 通知 Observer:即将休眠        __CFRunLoopDoObservers(rl, rlm, kCFRunLoopBeforeWaiting);        // 6. 🔥 核心:调用 mach_msg 等待内核消息,线程在此休眠        //    当没有消息时,线程被挂起,CPU 占用为 0        __CFRunLoopServiceMachPort(waitSet, &msg, ...);        // 7. 被唤醒后,通知 Observer:结束休眠        __CFRunLoopDoObservers(rl, rlm, kCFRunLoopAfterWaiting);    handle_msg:        // 8. 处理唤醒事件        if (msg是Timer) {            __CFRunLoopDoTimers(rl, rlm);        } else if (msg是GCD) {            __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__();        } else if (msg是Source1) {            __CFRunLoopDoSource1(rl, rlm, source);        }        // 9. 处理 Blocks        __CFRunLoopDoBlocks(rl, rlm);        // 10. 判断是否继续循环    } while (结果不为0 && 未停止);}

mach_msg() 是一个系统调用,它会让当前线程从用户态切换到内核态。内核会检查 Mach Port 的消息队列:

  • 如果有消息:立即返回,线程继续执行。

  • 如果没有消息:将线程挂起,CPU 时间片分配给其他线程,当前线程几乎不耗电。

这就是 RunLoop 能做到“有活干,没活睡”的底层原理。

3.4 Timer:定时器的底层实现

NSTimer其实就是 CFRunLoopTimerRef的上层封装。当我们创建一个 Timer 并添加到 RunLoop 时:

let timer = Timer(timeInterval1.0, repeatstrue) { _ in    print("Timer fired")}RunLoop.current.add(timer, forMode: .default)

RunLoop 内部会计算所有 Timer 的下一次触发时间,然后在调用 mach_msg() 时,设置一个超时时间(timeout)。这个超时时间等于距离最近一个 Timer 触发的时间间隔

// 计算休眠时长CFTimeInterval sleepInterval = __CFRunLoopGetNextTimerFireDate(rl, rlm);// 调用 mach_msg,最多等待 sleepInterval 秒__CFRunLoopServiceMachPort(waitSet, &msg, sleepInterval, ...);

这样,即使没有任何 Source1 事件,RunLoop 也会在 Timer 触发时被内核准时唤醒。

为什么滑动时 NSTimer 会暂停?

当用户滑动 UIScrollView 时,系统为了确保滑动的流畅度,会将主线程 RunLoop的 Mode 从 NSDefaultRunLoopMode切换为UITrackingRunLoopMode。而默认的Timer只添加在NSDefaultRunLoopMode 下,因此在滑动期间不会被处理。

解决方案:

RunLoop.current.add(timer, forMode: .common) // 添加到 CommonModes

3.5 Observer:RunLoop 的监控器

Observer 可以监听 RunLoop 的七个状态变化:

状态

枚举值

说明

Entry

kCFRunLoopEntry

即将进入 RunLoop

BeforeTimers

kCFRunLoopBeforeTimers

即将处理 Timer

BeforeSources

kCFRunLoopBeforeSources

即将处理 Source

BeforeWaiting

kCFRunLoopBeforeWaiting

即将休眠

AfterWaiting

kCFRunLoopAfterWaiting

刚被唤醒

Exit

kCFRunLoopExit

即将退出 RunLoop

AllActivities

-

监听所有状态

实战应用:利用 Observer 实现卡顿检测

原理:如果主线程 RunLoop 在BeforeSources到 BeforeWaiting之间的耗时超过阈值(比如50ms), 就认为发生了一次卡顿。

class LagMonitor {    private var observer: CFRunLoopObserver?    private var activitySemaphore: DispatchSemaphore?    private var timeoutCount = 0    func startMonitoring() {        let observer = CFRunLoopObserverCreateWithHandler(            kCFAllocatorDefault,            CFRunLoopActivity.allActivities.rawValue,            true,            0        ) { [weak self] observer, activity in            self?.handleActivity(activity)        }        CFRunLoopAddObserver(CFRunLoopGetMain(), observer, .commonModes)        self.observer = observer        // 开启一个子线程,定时检测主线程 RunLoop 状态        DispatchQueue.global().async {            while true {                let semaphore = DispatchSemaphore(value: 0)                self.activitySemaphore = semaphore                // 等待 50ms                let result = semaphore.wait(timeout: .now() + 0.05)                if result == .timedOut {                    // 超时未收到回调,说明主线程可能卡住了                    if self.timeoutCount < 5 {                        self.timeoutCount += 1                        continue                    }                    // 连续超时,记录卡顿堆栈                    self.recordLagStackTrace()                }                self.timeoutCount = 0            }        }    }    private func handleActivity(_ activityCFRunLoopActivity) {        // 每当 RunLoop 状态变化,就发信号,让子线程知道主线程还在正常工作        activitySemaphore?.signal()    }    private func recordLagStackTrace() {        // 获取主线程调用栈,记录卡顿发生位置        let symbols = Thread.callStackSymbols        print("⚠️ 检测到卡顿,堆栈:\(symbols)")    }}

这是很多性能监控SDK (如腾讯的 MLeaksFinder、美团的 Performance-Monitor) 的核心原理。

四、RunLoop 完整运行流程图解

结合上面的源码分析,我们可以画出 RunLoop 一次完整循环的详细流程:

五、RunLoop 经典应用场景与代码实战

5.1 线程保活(常驻线程)

AFNetworking2.x版本曾使用 RunLoop 实现常驻线程,用于后台网络回调处理。

class PermanentThreadNSObject {    private var thread: Thread?    private var runLoop: RunLoop?    override init() {        super.init()        thread = Thread(block: { [weak selfin            // 必须添加一个 Source/Timer/Observer,否则 RunLoop 会立即退出            self?.runLoop = RunLoop.current            self?.runLoop?.add(Port(), forMode: .default)            // 开启 RunLoop            while !Thread.current.isCancelled {                self?.runLoop?.run(mode: .default, before: Date.distantFuture)            }            print("线程退出")        })        thread?.start()    }    func executeTask(_ task@escaping () -> Void) {        guard let runLoop = runLoop else { return }        DispatchQueue.main.async {            // 将任务提交到常驻线程执行            CFRunLoopPerformBlock(runLoop.getCFRunLoop(), .default, task)            CFRunLoopWakeUp(runLoop.getCFRunLoop())        }    }    func stop() {        thread?.cancel()        CFRunLoopStop(runLoop?.getCFRunLoop())    }}// 使用示例let permanentThread = PermanentThread()permanentThread.executeTask {    print("在常驻线程中执行耗时任务")    // 这里的代码在子线程执行}

注意在现代 iOS 开发中,GCD 已经能很好地管理线程生命周期,除非有特殊需求(如需要精确控制线程生命周期、处理特定端口的回调),否则不建议手动保活线程。

5.2 延迟执行与取消

performSelector:withObject:afterDelay:的本质是创建一个 Timer 并添加到当前线程的 RunLoop。

// 延迟 2 秒执行perform(#selector(delayedMethod), with: nil, afterDelay2.0)// 取消延迟执行NSObject.cancelPreviousPerformRequests(withTargetself, selector: #selector(delayedMethod), object: nil)

陷阱:如果当前线程没有开启RunLoop,afterDelay系列方法是无效的。

DispatchQueue.global().async {    // 子线程默认没有 RunLoop    self.perform(#selector(self.method), with: nil, afterDelay1.0)    // 这个方法永远不会被调用!    // 如果要生效,需要手动开启 RunLoop    RunLoop.current.run()}

5.3 滑动时加载图片优化

在 UITableView 滑动时,不加载图片,等滑动停止后再加载,可以显著提升滑动流畅度。

// 利用 RunLoop 的 Mode 特性func scrollViewDidScroll(_ scrollViewUIScrollView) {    // 滑动时不加载图片}func scrollViewDidEndDragging(_ scrollViewUIScrollViewwillDecelerate decelerateBool) {    if !decelerate {        // 滑动停止,开始加载可见区域的图片        loadImagesForVisibleCells()    }}func scrollViewDidEndDecelerating(_ scrollViewUIScrollView) {    // 减速停止,开始加载可见区域的图片    loadImagesForVisibleCells()}func loadImagesForVisibleCells() {    // 获取可见 cell,加载图片}

更优雅的实现:利用CFRunLoopPerfo-rmBlock 在 RunLoop 空闲时执行任务。

// 在 RunLoop 即将休眠前执行低优先级任务CFRunLoopPerformBlock(CFRunLoopGetMain(), .default) {    // 加载图片、预计算高度等耗时但不紧急的任务    self.loadImagesForVisibleCells()}

5.4 AutoreleasePool 与 RunLoop

苹果在主线程 RunLoop 中注册了两个 Observer,用于管理自动释放池:

  1. Entry Observer(优先级最高):在 RunLoop 进入时创建 AutoreleasePool。

  2. BeforeWaiting Observer(优先级最低):在 RunLoop 休眠前销毁旧的 AutoreleasePool,并创建一个新的。

// 简化代码演示void setupAutoreleasePoolForRunLoop() {    CFRunLoopObserverRef entryObserver = CFRunLoopObserverCreate(..., kCFRunLoopEntry, ...);    CFRunLoopAddObserver(runloop, entryObserver, kCFRunLoopCommonModes);    CFRunLoopObserverRef beforeWaitingObserver = CFRunLoopObserverCreate(..., kCFRunLoopBeforeWaiting, ...);    CFRunLoopAddObserver(runloop, beforeWaitingObserver, kCFRunLoopCommonModes);}

因此,Autorelease 对象的释放时机是

 RunLoop 即将休眠时。这也是为什么我们在 viewDidLoad 中创建的大量临时对象,不会立即释放,而是等到本次 RunLoop 循环结束。

六、RunLoop 调试与可视化工具

6.1 lldb 命令调试

在 Xcode 断点中,使用 lldb 命令查看 RunLoop 状态:

# 打印主线程 RunLoop(lldb) po [NSRunLoop mainRunLoop]# 打印当前 RunLoop 的 Mode(lldb) po [[NSRunLoop currentRunLoop] currentMode]# 查看 RunLoop 中的所有 Timer(lldb) po [[NSRunLoop currentRunLoop] timers]# 查看 RunLoop 中的所有 Source(lldb) po [[NSRunLoop currentRunLoop] sources]

输出示例:

<CFRunLoop 0x6000001f0300 [0x10a8c7c50]> {    current mode = kCFRunLoopDefaultMode,    common modes = {        UITrackingRunLoopMode,        kCFRunLoopDefaultMode    },    common mode items = {        Source0 { ... },        Source1 { ... },        Timer { ... },        Observer { ... }    },    modes = {        UITrackingRunLoopMode { ... },        GSEventReceiveRunLoopMode { ... },        kCFRunLoopDefaultMode { ... },        UIInitializationRunLoopMode { ... }    }}

6.2 自定义 RunLoop 监控工具

我们可以写一个调试工具,实时在控制台输出 RunLoop 状态变化:

class RunLoopDebugger {    static func start() {        let observer = CFRunLoopObserverCreateWithHandler(            kCFAllocatorDefault,            CFRunLoopActivity.allActivities.rawValue,            true,            0        ) { observer, activity in            let mode = RunLoop.current.currentMode?.rawValue ?? "nil"            var activityName = ""            switch activity {            case .entry: activityName = "Entry"            case .beforeTimers: activityName = "BeforeTimers"            case .beforeSources: activityName = "BeforeSources"            case .beforeWaiting: activityName = "BeforeWaiting"            case .afterWaiting: activityName = "AfterWaiting"            case .exit: activityName = "Exit"            default: activityName = "Unknown"            }            print("🔵 [RunLoop] 状态: \(activityName), Mode: \(mode)")        }        CFRunLoopAddObserver(CFRunLoopGetMain(), observer, .commonModes)    }}// 在 AppDelegate 中调用RunLoopDebugger.start()

运行 App 后,控制台会实时输出类似信息:

🔵 [RunLoop] 状态: Entry, Mode: UIInitializationRunLoopMode🔵 [RunLoop] 状态: BeforeTimers, Mode: kCFRunLoopDefaultMode🔵 [RunLoop] 状态: BeforeSources, Mode: kCFRunLoopDefaultMode🔵 [RunLoop] 状态: BeforeWaiting, Mode: kCFRunLoopDefaultMode😴 即将休眠...⏰ 被唤醒,原因:触摸事件🔵 [RunLoop] 状态: AfterWaiting, Mode: kCFRunLoopDefaultMode🔵 [RunLoop] 状态: BeforeTimers, Mode: UITrackingRunLoopMode...

6.3 Instruments 中的 Time Profiler

使用Xcode Instruments的Time Profiler 工具,可以清晰地看到主线程 RunLoop 在不同状态下的耗时分布。在分析性能问题时,关注 CFRunLoopRun相关的调用栈,能快速定位卡顿原因。

七、常见面试题深度解析

Q1

为什么 UI 操作必须在主线程?

A

UIKit 框架本身不是线程安全的。但更深层次的原因是,主线程的 RunLoop 是整个事件分发系统的中枢。触摸事件、渲染回调、CAAnimation 的代理回调等,都依赖于主线程 RunLoop 的 Source0 和 Source1 机制。如果允许子线程操作 UI,就破坏了这套事件驱动模型的统一性,会导致不可预测的并发问题。

Q2

performSelector:afterDelay:在子线程能用吗?

A

能用,但前提是子线程必须开启了 RunLoop。afterDelay 的本质是创建一个 NSTimer 并添加到当前线程的 RunLoop。如果没有 RunLoop,Timer 无法被调度,方法就不会执行。

Q3

CADisplayLink和NSTimer有什么区别?

A

特性

CADisplayLink

NSTimer

驱动源

屏幕刷新信号(Vsync)

RunLoop 的 Timer 机制

精度

与屏幕刷新率同步(60/120 fps)

受 RunLoop 忙碌程度影响,可能不准

用途

动画、绘制、视频渲染

一般定时任务

RunLoop Mode

默认只在 DefaultMode 和 TrackingMode

需手动指定

CADisplayLink 的特殊之处在于,它的回调是在 RunLoop 处理完所有事件之后、渲染之前执行的,因此适合做 UI 更新。

Q4

如何检测主线程卡顿?

A

核心思路是利用RunLoop Observer 监控 BeforeSources到BeforeWaiting之间的耗时。如果主线程在这段时间内耗时过长(比如超过 50ms),说明在处理某个任务时发生了阻塞。可以结合子线程的 Ping 机制来检测超时。

Q5

AFNetworking 2.x 为什么要常驻线程?

A

AFNetworking 2.x 使用NSURLConnect-tion进行网络请求。NSURLConnection 的代理回调必须在创建它的线程上执行,且该线程必须有 RunLoop。为了不让主线程处理网络回调(可能影响 UI),AFN 创建了一个常驻线程,并开启了 RunLoop,专门用来接收网络回调。AFNetworking3.x 改用NSURLSession后,不再需要常驻线程,因为NSURLSession 自己管理了一个后台线程池。

总结与进阶建议

RunLoop 是 iOS 开发进阶的必经之路。掌握了 RunLoop,你才能回答:

  • App 为什么能一直运行?

  • 滑动时 Timer 为什么暂停?

  • 自动释放池什么时候释放对象?

  • 主线程卡顿怎么检测?

核心知识点回顾

层次

核心概念

关键要点

底层

Mach Port

内核消息传递,实现线程休眠与唤醒

中层

Source / Timer / Observer

事件源、定时器、状态监听者

上层

Mode

工作模式,决定 RunLoop 处理哪些事件

应用

主线程 RunLoop

自动开启,负责 UI 事件分发

进阶学习路径

  1. 阅读源码:苹果开源了     CoreFoundation 框架,CFRunLoop.c是必读文件。

  2. 理解 GCD 与 RunLoop 的关系:GCD 的主队列是如何与 RunLoop 交互的?

  3. 研究事件响应链:触摸事件是如何从 Source0 传递到 hitTest再到UIResponder 的?

  4. 探索渲染流程:CALayer的渲染与 RunLoop 的 BeforeWaiting 时机有何关联?

文字来源 | iOS组

编辑排版 | 黄佩婷

新思路出品

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