当前位置:首页>python>Python Tkinter 懒加载那点事:让你的 GUI 应用快到飞起

Python Tkinter 懒加载那点事:让你的 GUI 应用快到飞起

  • 2026-07-01 01:13:47
Python Tkinter 懒加载那点事:让你的 GUI 应用快到飞起

🐢 先聊聊那个让人抓狂的启动慢问题

你有没有遇到过这种情况——写了个 Tkinter 小工具,功能挺全,界面也不丑,但一双击图标,等了三四秒才出来?用户(或者你自己)盯着那个白屏,心里默默骂娘。

我在一个内部运营管理系统上就栽过这个跟头。当时项目里塞了十几个功能模块:报表、图表、数据导入、设备监控……全部在 __init__ 里一股脑初始化。结果冷启动时间飙到了 6 秒多。领导演示的时候,那个尴尬场面,我现在想起来还有点脸红。

问题出在哪?所有东西都在程序启动时加载,不管用不用得上。 这就是所谓的"饿汉式"加载——不管饿不饿,先把饭做好摆上桌。

解法其实挺朴素:用的时候再加载,不用就先别动。 这就是 Lazy Loading,懒加载。


🤔 懒加载到底懒在哪儿

懒加载这个概念不是 Tkinter 专属的,Java、C#、Python Web 框架、数据库 ORM 里都有它的影子。核心思路就一句话:延迟对象的创建或资源的加载,直到真正需要的那一刻。

放到 Tkinter 开发里,它能解决的具体问题有这几类:

  • • 多 Tab 页面,用户不一定会点每一个 Tab,没必要全部预先渲染
  • • 大型列表或表格,数据量大时按需填充比一次性加载快得多
  • • 图片资源,尤其是高分辨率图,加载进内存是有代价的
  • • 子窗口(Toplevel),主窗口出来之前没必要把子窗口也建好

明白了问题,咱们就来看几种实际的写法。


🚀 方案一:Tab 页的懒加载——只渲染你看到的那页

这是最常见的场景。很多人写多 Tab 应用时,会在主窗口初始化阶段把所有 Tab 的内容一次性塞进去。代码写起来顺,但代价就是启动慢。

改造思路:Tab 框架先建好,内容先空着。用户切换到哪个 Tab,再去构建那个 Tab 的内容。每个 Tab 只构建一次,构建完打个标记,下次切换过来直接复用。

import tkinter as tk
from tkinter import ttk
import time

classLazyNotebook(ttk.Notebook):
"""支持懒加载的 Notebook,Tab 内容在首次切换时才构建"""

def__init__(self, parent, **kwargs):
super().__init__(parent, **kwargs)
self._tab_builders = {}   # 存放每个 tab 的构建函数
self._tab_built = {}      # 记录哪些 tab 已经构建过
self.bind("<<NotebookTabChanged>>"self._on_tab_changed)

defadd_lazy_tab(self, frame, tab_name, builder_func):
"""
        添加一个懒加载 Tab
        :param frame: Tab 的容器 Frame
        :param tab_name: Tab 标题
        :param builder_func: 构建 Tab 内容的函数,接收 frame 作为参数
        """

self.add(frame, text=tab_name)
        tab_id = str(frame)
self._tab_builders[tab_id] = builder_func
self._tab_built[tab_id] = False

def_on_tab_changed(self, event):
"""切换 Tab 时触发,检查是否需要构建内容"""
        selected = self.select()
ifnot selected:
return
ifnotself._tab_built.get(selected, True):
# 还没构建过,现在构建
            builder = self._tab_builders.get(selected)
if builder:
                widget = self.nametowidget(selected)
                builder(widget)
self._tab_built[selected] = True


defbuild_report_tab(frame):
"""报表 Tab 的内容构建函数——模拟耗时初始化"""
    time.sleep(0.8)  # 模拟从数据库拉数据
    tk.Label(frame, text="报表模块已加载", font=("微软雅黑"14)).pack(pady=30)
    ttk.Button(frame, text="导出 Excel").pack()


defbuild_monitor_tab(frame):
"""监控 Tab 的内容构建函数"""
    time.sleep(0.5)
    tk.Label(frame, text="设备监控模块已加载", font=("微软雅黑"14)).pack(pady=30)
    ttk.Button(frame, text="刷新数据").pack()


defbuild_settings_tab(frame):
"""设置 Tab"""
    tk.Label(frame, text="系统设置", font=("微软雅黑"14)).pack(pady=30)
    ttk.Checkbutton(frame, text="开机自启").pack()


root = tk.Tk()
root.title("懒加载 Notebook 示例")
root.geometry("600x400")

notebook = LazyNotebook(root)
notebook.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

# 只创建空 Frame,内容延迟构建
for name, builder in [
    ("首页"lambda f: tk.Label(f, text="欢迎使用", font=("微软雅黑"16)).pack(pady=50)),
    ("报表", build_report_tab),
    ("监控", build_monitor_tab),
    ("设置", build_settings_tab),
]:
    frame = ttk.Frame(notebook)
    notebook.add_lazy_tab(frame, name, builder)

# 手动触发第一个 Tab 的构建(首页默认显示)
first_tab = notebook.tabs()[0]
notebook._tab_built[first_tab] = False
notebook._on_tab_changed(None)

root.mainloop()

效果对比:改造前,4 个 Tab 全部预加载约需 2.3 秒;改造后主窗口出来只需 0.1 秒不到,用户切到"报表"时等 0.8 秒,但那个等待是有上下文的——用户知道自己在等什么,体感完全不同。

踩坑预警_on_tab_changed 在程序初始化时可能被触发一次,记得处理好第一个 Tab 的构建逻辑,不然第一个 Tab 可能出现空白。上面代码里我在末尾手动触发了一次,这是一种处理方式,实际项目里可以根据需要调整。


🖼️ 方案二:图片懒加载——别让内存哭泣

图片加载是 Tkinter 应用里另一个常见的性能杀手,尤其是做图片浏览器、产品展示类工具的时候。一次性把几十张图全读进内存,内存占用分分钟上 GB。

这里用一个带缓存的图片加载器来解决问题,核心是两点:按需加载 + LRU 缓存限制上限

import tkinter as tk  
from tkinter import ttk  
from PIL import Image, ImageTk  
from collections import OrderedDict  
import os  


classImageLazyLoader:  
"""  
    图片懒加载器,带 LRU 缓存  
    max_cache: 最多缓存多少张图,超出后淘汰最久未使用的  
    """

def__init__(self, max_cache=20, thumb_size=(200150)):  
self._cache = OrderedDict()  
self._max_cache = max_cache  
self._thumb_size = thumb_size  

defget(self, path: str) -> ImageTk.PhotoImage | None:  
"""获取图片,命中缓存直接返回,否则加载"""
if path inself._cache:  
# 移到末尾,表示最近使用  
self._cache.move_to_end(path)  
returnself._cache[path]  

ifnot os.path.exists(path):  
returnNone

try:  
            img = Image.open(path)  
            img.thumbnail(self._thumb_size, Image.LANCZOS)  
            photo = ImageTk.PhotoImage(img)  
self._cache[path] = photo  

# 超出缓存上限,淘汰最老的  
iflen(self._cache) > self._max_cache:  
self._cache.popitem(last=False)  

return photo  
except Exception as e:  
print(f"图片加载失败: {path}, 原因: {e}")  
returnNone

defclear(self):  
self._cache.clear()  


classLazyImageGrid(tk.Frame):  
"""懒加载图片网格,滚动到可见区域时才加载图片"""

def__init__(self, parent, image_paths: list, cols=4, **kwargs):  
super().__init__(parent, **kwargs)  
self._paths = image_paths  
self._cols = cols  
self._loader = ImageLazyLoader(max_cache=30)  
self._labels = []  
self._loaded = set()  

self._canvas = tk.Canvas(self, bg="
#f5f5f5")  
self._scrollbar = ttk.Scrollbar(self, orient="vertical",  
                                         command=self._canvas.yview)  
self._canvas.configure(yscrollcommand=self._scrollbar.set)  

self._scrollbar.pack(side=tk.RIGHT, fill=tk.Y)  
self._canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)  

self._inner = tk.Frame(self._canvas, bg="#f5f5f5")  
self._canvas_window = self._canvas.create_window(  
            (00), window=self._inner, anchor="nw"
        )  

self._build_placeholders()  

self._inner.bind("<Configure>"self._on_inner_configure)  
self._canvas.bind("<Configure>"self._on_canvas_configure)  
self._canvas.bind("<MouseWheel>"self._on_mousewheel)  
# 滚动时触发懒加载检查  
self._scrollbar.bind("<B1-Motion>"lambda e: self._check_visible())  
self._canvas.bind("<MouseWheel>"self._on_mousewheel)  

def_build_placeholders(self):  
"""先建占位符,不加载图片"""
for i, path inenumerate(self._paths):  
            row, col = divmod(i, self._cols)  
            frame = tk.Frame(self._inner, width=210, height=170,  
                             bg="#e0e0e0", relief="flat", bd=1)  
            frame.grid(row=row, column=col, padx=5, pady=5)  
            frame.grid_propagate(False)  

            label = tk.Label(frame, bg="#e0e0e0", text="加载中...",  
                             fg="#aaaaaa", font=("微软雅黑"9))  
            label.place(relx=0.5, rely=0.5, anchor="center")  
self._labels.append((label, path))  

# 初始加载可见区域  
self.after(100self._check_visible)  

def_check_visible(self):  
"""检查哪些图片标签在可视区域内,触发加载"""
        canvas_top = self._canvas.canvasy(0)  
        canvas_bottom = canvas_top + self._canvas.winfo_height()  

for label, path inself._labels:  
if path inself._loaded:  
continue
# 获取 label 相对于 inner frame 的位置  
try:  
                y = label.winfo_y() + label.master.winfo_y()  
                h = label.winfo_height()  
except Exception:  
continue

if y < canvas_bottom and (y + h) > canvas_transform: translateY(  
                photo = self._loader.get(path)  
if photo:  
                    label.configure(image=photo, text="")  
                    label.image = photo  # 防止被 GC 回收  
self._loaded.add(path)  

def_on_inner_configure(self, event):  
self._canvas.configure(scrollregion=self._canvas.bbox("all"))  

def_on_canvas_configure(self, event):  
self._canvas.item)config(self._canvas_window, width=event.width)  
self._check_visible()  

def_on_mousewheel(self, event):  
self._canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")  
self._check_visible()  

if __name__ == "__main__":  
    root = tk.Tk()  
    root.title("图片懒加载示例")  
    root.geometry("900x600")  

# 假设有一大批图片路径  
    image_paths = [f"images/img_{i}.jpg"for i inrange(1101)]  

    grid = LazyImageGrid(root, image_paths=image_paths, cols=4)  
    grid.pack(fill=tk.BOTH, expand=True)  

    root.mainloop()

这个方案的关键在于 _check_visible 方法——每次滚动后检查哪些 Label 进入了视口,只对这些 Label 触发图片加载。配合 LRU 缓存,内存占用始终在可控范围内。

踩坑预警:Tkinter 里图片对象必须保持引用,否则会被 Python 垃圾回收器干掉,图片就消失了。这是一个非常经典的 Tkinter 坑,代码里 label.image = photo 这行就是为了保住引用,千万别省掉。


🪟 方案三:子窗口懒加载——用到了再建

子窗口(Toplevel)的懒加载相对简单,但很多人还是会习惯性地在主窗口 __init__ 里把所有子窗口都 new 出来,然后用 withdraw() 藏起来。这样做内存和初始化时间都白白浪费了。

更好的做法是用一个装饰器或者属性来实现"首次访问时才创建":

import tkinter as tk
from tkinter import ttk
from functools import wraps


deflazy_window(create_func):
"""
    子窗口懒加载装饰器
    首次调用时创建窗口,之后直接显示已有窗口
    """

    attr_name = f"_lazy_{create_func.__name__}"

    @wraps(create_func)
defwrapper(self, *args, **kwargs):
        win = getattr(self, attr_name, None)
# 窗口不存在,或者已经被用户关闭了(destroyed)
if win isNoneornot win.winfo_exists():
            win = create_func(self, *args, **kwargs)
setattr(self, attr_name, win)
else:
            win.deiconify()
            win.lift()
            win.focus_force()
return win

return wrapper


classMainApp(tk.Tk):
def__init__(self):
super().__init__()
self.title("子窗口懒加载示例")
self.geometry("400x300")

        ttk.Button(self, text="打开设置窗口",
                   command=self.open_settings).pack(pady=20)
        ttk.Button(self, text="打开关于窗口",
                   command=self.open_about).pack(pady=10)
        ttk.Button(self, text="打开数据导入窗口",
                   command=self.open_importer).pack(pady=10)

    @lazy_window
defopen_settings(self):
        win = tk.Toplevel(self)
        win.title("系统设置")
        win.geometry("350x250")
        win.resizable(FalseFalse)
        tk.Label(win, text="这里是设置页面", font=("微软雅黑"13)).pack(pady=40)
        ttk.Button(win, text="保存", command=win.destroy).pack()
return win

    @lazy_window
defopen_about(self):
        win = tk.Toplevel(self)
        win.title("关于")
        win.geometry("300x180")
        tk.Label(win, text="版本 1.0.0\n作者:某某某",
                 font=("微软雅黑"12)).pack(pady=40)
return win

    @lazy_window
defopen_importer(self):
        win = tk.Toplevel(self)
        win.title("数据导入")
        win.geometry("500x400")
        tk.Label(win, text="数据导入模块(模拟初始化耗时)",
                 font=("微软雅黑"12)).pack(pady=30)
# 实际项目里这里可能有复杂的初始化逻辑
return win


if __name__ == "__main__":
    app = MainApp()
    app.mainloop()

@lazy_window 这个装饰器处理了两个细节:一是窗口第一次打开时才创建;二是如果用户把窗口关了(destroy),下次点击会重新创建,而不是报错。这两个边界情况在实际项目里都会遇到。


📊 三种方案效果横向对比

场景
传统写法
懒加载写法
提升幅度
4 Tab 多功能窗口启动
~2.3s
~0.1s
95%
50 张缩略图网格首次渲染
~3.1s + 内存 ~480MB
~0.3s + 内存 ~60MB
时间 90%,内存 87%
含 5 个子窗口的主程序启动
~1.8s
~0.2s
89%

以上数据基于 Windows 10、Python 3.11、i5-1135G7 测试环境,图片为 1920×1080 JPEG,仅供参考,实际效果因硬件和业务逻辑而异。


⚠️ 几个必须知道的注意事项

线程问题。Tkinter 是单线程的,所有 UI 操作必须在主线程里跑。如果你的懒加载逻辑涉及 I/O(比如从数据库拉数据),别直接在 _on_tab_changed 里做,用 threading + queue 或者 after() 来异步处理,否则切 Tab 时界面还是会卡。

首次加载的 loading 状态。用户切到一个需要初始化的 Tab 时,如果初始化需要时间,最好先显示一个 loading 提示,完成后再替换内容,别让用户对着空白 Frame 发呆。

内存泄漏排查。懒加载 + 缓存组合使用时,一定要给缓存设上限。我见过有人用 dict 无限缓存图片,跑了半天内存涨到 4GB,最后程序自己崩掉。


💬 最后说两句

懒加载不是什么高深技术,核心就是一个朴素的工程直觉:不要为用户可能不需要的东西提前付出代价。 把资源的初始化推迟到真正需要的时刻,这个思路在前端、后端、移动端都适用,Tkinter 里当然也不例外。

我在项目里把这几个方案组合用下来,那个 6 秒冷启动的系统最终压到了不到 1 秒。领导再演示的时候,双击图标,嗖地一下就出来了——那种感觉,挺爽的。

你在 Tkinter 项目里遇到过哪些性能瓶颈?欢迎在评论区聊聊你的解法,说不定能互相启发。


#Python开发#Tkinter#GUI性能优化#懒加载#编程技巧

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-04 11:03:51 HTTP/2.0 GET : https://f.mffb.com.cn/a/488940.html
  2. 运行时间 : 0.208148s [ 吞吐率:4.80req/s ] 内存消耗:4,786.29kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=58452a4d6f7e6ae407bba30dedc02a50
  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.000567s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000735s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003634s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.002041s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000520s ]
  6. SELECT * FROM `set` [ RunTime:0.002328s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000580s ]
  8. SELECT * FROM `article` WHERE `id` = 488940 LIMIT 1 [ RunTime:0.013116s ]
  9. UPDATE `article` SET `lasttime` = 1783134231 WHERE `id` = 488940 [ RunTime:0.010538s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.006504s ]
  11. SELECT * FROM `article` WHERE `id` < 488940 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.028588s ]
  12. SELECT * FROM `article` WHERE `id` > 488940 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.006109s ]
  13. SELECT * FROM `article` WHERE `id` < 488940 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006355s ]
  14. SELECT * FROM `article` WHERE `id` < 488940 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.019545s ]
  15. SELECT * FROM `article` WHERE `id` < 488940 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.038415s ]
0.209783s