当前位置:首页>python>工业上位机界面设计:Python GUI框架选择指南

工业上位机界面设计:Python GUI框架选择指南

  • 2026-07-02 19:40:18
工业上位机界面设计:Python GUI框架选择指南

🏭 你真的选对框架了吗?

做工控软件这行,我见过太多人在框架选型上走弯路。有个做注塑机控制系统的朋友,项目做到一半才发现自己选的框架根本撑不住实时数据刷新——界面卡得像PPT,客户现场演示当场翻车。

工业上位机不是普通桌面软件。它要同时处理串口数据、Modbus通信、实时曲线绘制,还得保证界面响应不能掉链子。这种场景下,框架选错了,后期重构的代价比从头写还高。

咱们今天就把这个问题掰开了说清楚。


🎯 工业上位机的特殊需求

在聊具体框架之前,先得搞清楚工控界面到底有哪些"特殊癖好"——这跟做个普通管理系统完全不是一回事。

实时性要求苛刻。 传感器数据可能100ms刷新一次,界面必须跟得上,不能有明显的视觉延迟。

数据可视化密集。 温度曲线、压力波形、设备状态图——这些东西不是随便画个折线图就完事的,得支持大数据量高频更新。

稳定性是命根子。 工厂环境里,软件崩一次可能导致生产线停工,损失直接按小时算。

Windows部署为主。 大多数工控现场还是Windows 7/10环境,有些甚至是XP(别笑,真的存在)。

操作员不是程序员。 界面要足够直观,触摸屏友好,字体要大,按钮要明显。

带着这些需求,我们来看几个主流方案。


🔧 框架横评:四个选手上场

1️⃣ PyQt5/PyQt6 —— 工控界的"老大哥"

说实话,如果你问我工控领域用哪个框架最稳,我会毫不犹豫说PyQt。不是因为它完美,而是因为它踩过的坑都被前人填好了

Qt本身就是为工业和嵌入式场景设计的,背后是诺基亚和西门子这些老牌工业公司多年投入的成果。PyQt只是给它套了层Python外衣。

python1import sys2from PyQt5.QtWidgets import (QApplicationQMainWindow,3QWidgetQVBoxLayoutQLabel)4from PyQt5.QtCore import QTimerQt5from PyQt5.QtGui import QFont6import pyqtgraph as pg7import random89class IndustrialMonitor(QMainWindow):10"""工业监控主窗口 - 实时数据显示示例"""1112def __init__(self):13super().__init__()14        self.setWindowTitle("设备监控系统 v2.1")15        self.setMinimumSize(1200800)1617# 数据缓冲区,保留最近500个点18        self.data_buffer = []19        self.max_points = 5002021        self._setup_ui()22        self._start_data_timer()2324def _setup_ui(self):25        central = QWidget()26        self.setCentralWidget(central)27        layout = QVBoxLayout(central)2829# 状态标签30        self.status_label = QLabel("设备状态:运行中")31        font = QFont("Microsoft YaHei"14QFont.Bold)32        self.status_label.setFont(font)33        self.status_label.setStyleSheet("color: #00AA00; padding: 8px;")34        layout.addWidget(self.status_label)3536# 实时曲线图(pyqtgraph 比 matplotlib 快10倍以上)37        self.plot_widget = pg.PlotWidget(title="主轴温度实时曲线")38        self.plot_widget.setBackground('#1a1a2e')39        self.plot_widget.showGrid(x=True, y=True, alpha=0.3)40        self.plot_widget.setLabel('left''温度', units='°C')41        self.plot_widget.setLabel('bottom''时间', units='s')4243# 设置Y轴范围(工控场景通常有明确的量程)44        self.plot_widget.setYRange(0150)4546        self.curve = self.plot_widget.plot(47            pen=pg.mkPen(color='#00d4ff', width=2)48        )49        layout.addWidget(self.plot_widget)5051def _start_data_timer(self):52"""100ms刷新一次,模拟真实采集频率"""53        self.timer = QTimer()54        self.timer.timeout.connect(self._update_data)55        self.timer.start(100)5657def _update_data(self):58# 实际项目中这里替换为串口/Modbus读取59        new_value = 75 + random.gauss(03)60        self.data_buffer.append(new_value)6162if len(self.data_buffer) > self.max_points:63            self.data_buffer.pop(0)6465        self.curve.setData(self.data_buffer)6667# 超温报警68if new_value > 100:69            self.status_label.setText(f"⚠️ 温度告警:{new_value:.1f}°C")70            self.status_label.setStyleSheet("color: #FF4444; padding: 8px;")71else:72            self.status_label.setText(f"设备状态:正常 | 当前温度:{new_value:.1f}°C")73            self.status_label.setStyleSheet("color: #00AA00; padding: 8px;")7475if __name__ == '__main__':76    app = QApplication(sys.argv)77    window = IndustrialMonitor()78    window.show()79    sys.exit(app.exec_())

这里有个细节值得说一下:pyqtgraph而不是matplotlib。后者在高频刷新场景下会卡成狗,前者基于OpenGL渲染,100ms刷新500个数据点轻轻松松。这是工控开发里最常见的一个坑,我见过不止三个项目因为这个问题重写了图表模块。

PyQt的适用场景: 中大型上位机系统、需要自定义控件(仪表盘、指示灯、流程图)、有长期维护需求的项目。

需要注意的地方: 商业项目需要购买授权(或者用LGPL的PySide6替代),学习曲线比tkinter陡一些。


2️⃣ tkinter —— 入门可以,别指望太多

tkinter是Python自带的,零安装成本,这是它最大的优势。拿来做个简单的参数配置界面、小工具,完全够用。

但是——在工控场景下,它的天花板很低。

原生控件丑,自定义难度大。没有内置的图表组件,得靠matplotlib嵌入,而matplotlib的实时性能在工控场景下经常不够用。多线程处理也比较麻烦,稍不注意就会遇到界面假死的问题。

python1import tkinter as tk2from tkinter import ttk, messagebox3import json4import os56# 配置文件路径(与脚本同目录)7CONFIG_FILE = "device_params.json"89# 默认参数定义:(显示名, 默认值, 最小值, 最大值)10PARAM_DEFS = [11    ("最大速度 (mm/s)",  "1000"1,    9999),12    ("加速度 (mm/s²)",   "500",  1,    5000),13    ("定位精度 (μm)",    "10",   1,    1000),14]151617class SimpleParamConfig(tk.Tk):18"""工控设备参数配置界面(完整版)"""1920def __init__(self):21super().__init__()22        self.title("设备参数配置")23        self.geometry("420x320")24        self.resizable(FalseFalse)2526        self.entries: dict[str, ttk.Entry] = {}27        self._build_form()28        self._load_config()   # 启动时读取上次保存的配置2930#  界面构建31def _build_form(self):32        frame = ttk.LabelFrame(self, text="运动控制参数", padding=15)33        frame.pack(fill="both", expand=True, padx=12, pady=(126))3435for i, (label, default, lo, hi) in enumerate(PARAM_DEFS):36            ttk.Label(frame, text=label).grid(37                row=i, column=0, sticky="w", pady=638            )39            entry = ttk.Entry(frame, width=14, justify="right")40            entry.insert(0, default)41            entry.grid(row=i, column=1, padx=10, pady=6)4243# 范围提示44            ttk.Label(45                frame,46                text=f"[{lo} ~ {hi}]",47                foreground="#888888",48                font=(""8),49            ).grid(row=i, column=2, sticky="w")5051            self.entries[label] = entry525354        self.status_var = tk.StringVar(value="就绪")55        status_bar = ttk.Label(56            self,57            textvariable=self.status_var,58            relief="sunken",59            anchor="w",60            padding=(62),61        )62        status_bar.pack(fill="x", side="bottom")6364        btn_frame = ttk.Frame(self)65        btn_frame.pack(pady=8)6667        ttk.Button(btn_frame, text="保存配置",68                   command=self._save_config).grid(row=0, column=0, padx=8)69        ttk.Button(btn_frame, text="重置默认",70                   command=self._reset_defaults).grid(row=0, column=1, padx=8)717273#  核心逻辑74def _validate(self) -> dict | None:75"""76        校验所有输入项。77        返回 {label: int} 字典,校验失败返回 None。78        """79        result = {}80for label, lo, hi in [81            (name, lo, hi) for name, _, lo, hi in PARAM_DEFS82        ]:83            raw = self.entries[label].get().strip()8485# 必须是整数86if not raw.lstrip("-").isdigit():87                messagebox.showerror(88"输入错误",89f"「{label}」请输入整数,当前值:{raw!r}",90                )91                self.entries[label].focus_set()92return None9394            val = int(raw)9596# 范围检查97if not (lo <= val <= hi):98                messagebox.showerror(99"范围错误",100f"「{label}」超出范围 [{lo} ~ {hi}],当前值:{val}",101                )102                self.entries[label].focus_set()103return None104105            result[label] = val106107return result108109def _save_config(self):110"""校验 → 写 JSON → 更新状态栏"""111        params = self._validate()112if params is None:113return  # 校验失败,弹窗已提示114115try:116with open(CONFIG_FILE"w", encoding="utf-8"as f:117                json.dump(params, f, ensure_ascii=False, indent=2)118119            self.status_var.set(f"✔ 配置已保存至 {os.path.abspath(CONFIG_FILE)}")120print("[保存成功]")121for k, v in params.items():122print(f"  {k}: {v}")123124except OSError as e:125            messagebox.showerror("保存失败"f"写入文件时出错:\n{e}")126127def _load_config(self):128"""从 JSON 读取上次保存的值,文件不存在则静默跳过"""129if not os.path.exists(CONFIG_FILE):130return131132try:133with open(CONFIG_FILE"r", encoding="utf-8"as f:134                params: dict = json.load(f)135136for label, entry in self.entries.items():137if label in params:138                    entry.delete(0, tk.END)139                    entry.insert(0str(params[label]))140141            self.status_var.set(f"已加载上次配置:{CONFIG_FILE}")142143except (OSError, json.JSONDecodeErroras e:144            self.status_var.set(f"⚠ 读取配置失败:{e}")145146def _reset_defaults(self):147"""一键恢复所有默认值"""148for label, default, *_ in PARAM_DEFS:149            self.entries[label].delete(0, tk.END)150            self.entries[label].insert(0, default)151        self.status_var.set("已重置为默认值(未保存)")152153154155#  入口156if __name__ == "__main__":157    app = SimpleParamConfig()158    app.mainloop()

结论: 小工具、内部配置面板用tkinter没问题。一旦涉及实时数据显示、复杂交互,果断换PyQt。


3️⃣ Dear PyGui —— 新兴选手,潜力不小

这个框架很多工控开发者可能没听说过。Dear PyGui基于ImGui(游戏开发里大名鼎鼎的即时模式GUI库),GPU加速渲染,性能相当彪悍。

python1import dearpygui.dearpygui as dpg2import random3import math4import time56def generate_waveform(points=100):7return [math.sin(i * 0.1) * 50 + 75 + random.gauss(02)8for i in range(points)]91011pressure_data = generate_waveform()12temp_data = [math.sin(i * 0.05) * 10 + 85 + random.gauss(01for i in range(100)]13flow_data = [math.cos(i * 0.08) * 20 + 60 + random.gauss(01.5for i in range(100)]1415running = True16last_update = time.time()1718def update_data():19global pressure_data, temp_data, flow_data, last_update2021    now = time.time()22if now - last_update < 1.0:23return24    last_update = now2526    new_p = math.sin(now * 0.5) * 50 + 75 + random.gauss(02)27    new_t = math.sin(now * 0.3) * 10 + 85 + random.gauss(01)28    new_f = math.cos(now * 0.4) * 20 + 60 + random.gauss(01.5)2930    pressure_data.append(new_p)31    pressure_data = pressure_data[-100:]3233    temp_data.append(new_t)34    temp_data = temp_data[-100:]3536    flow_data.append(new_f)37    flow_data = flow_data[-100:]3839    dpg.set_value("pressure_val"f"{new_p:.1f}")40    dpg.set_value("temp_val"f"{new_t:.1f}")41    dpg.set_value("flow_val"f"{new_f:.1f}")4243    xs = list(range(len(pressure_data)))44    dpg.set_value("pressure_series", [xs, pressure_data])45    dpg.set_value("temp_series", [xs, temp_data])46    dpg.set_value("flow_series", [xs, flow_data])474849def toggle_running(sender, app_data):50global running51    running = not running525354def reset_data(sender, app_data):55global pressure_data, temp_data, flow_data56    pressure_data = generate_waveform()57    temp_data = [math.sin(i * 0.05) * 10 + 85 + random.gauss(01for i in range(100)]58    flow_data = [math.cos(i * 0.08) * 20 + 60 + random.gauss(01.5for i in range(100)]596061print("Creating context...")62dpg.create_context()6364print("Creating window...")65with dpg.window(label="Monitor System", width=700, height=450, tag="main_window"):66    dpg.add_text("Real-time Monitor System", color=[100200255])67    dpg.add_separator()68    dpg.add_spacer(height=5)6970# Chart71with dpg.plot(label="Data Chart", height=220, width=-1):72        dpg.add_plot_axis(dpg.mvXAxis, label="Samples")73with dpg.plot_axis(dpg.mvYAxis, label="Values"):74            dpg.add_line_series(75list(range(100)),76                pressure_data,77                label="Pressure (bar)",78                tag="pressure_series"79            )80            dpg.add_line_series(81list(range(100)),82                temp_data,83                label="Temperature (C)",84                tag="temp_series"85            )86            dpg.add_line_series(87list(range(100)),88                flow_data,89                label="Flow (L/min)",90                tag="flow_series"91            )9293    dpg.add_spacer(height=10)9495# Data Display96with dpg.group(horizontal=True):97        dpg.add_text("Pressure: ")98        dpg.add_text("78.3", color=[0255100], tag="pressure_val")99        dpg.add_text("bar")100101        dpg.add_spacer(width=60)102        dpg.add_text("Temperature: ")103        dpg.add_text("85.0", color=[2551800], tag="temp_val")104        dpg.add_text("C")105106        dpg.add_spacer(width=60)107        dpg.add_text("Flow: ")108        dpg.add_text("60.0", color=[0180255], tag="flow_val")109        dpg.add_text("L/min")110111    dpg.add_spacer(height=10)112113# Buttons114with dpg.group(horizontal=True):115        dpg.add_button(label="Pause/Resume", callback=toggle_running, width=120)116        dpg.add_spacer(width=20)117        dpg.add_button(label="Reset", callback=reset_data, width=100)118119print("Creating viewport...")120dpg.create_viewport(title="Real-time Monitor System", width=720, height=480)121dpg.setup_dearpygui()122dpg.show_viewport()123dpg.set_primary_window("main_window"True)124125print("OK - Started!")126127frame = 0128try:129while dpg.is_dearpygui_running():130if running:131update_data()132133        dpg.render_dearpygui_frame()134        time.sleep(0.05)135136        frame += 1137if frame % 40 == 0:138print(f"Running - {frame} frames")139except KeyboardInterrupt:140print("\nStopped by user")141finally:142    dpg.destroy_context()143print("Done!")

Dear PyGui的优势在于极低的渲染开销——即便界面上有几十个实时更新的控件,CPU占用也能保持在一个很低的水平。对于需要同时显示大量通道数据的场景(比如多轴运动控制、多路传感器采集),这个特性很有价值。

注意:这个对Windows 支持有些问题!!!

不过它的生态还不成熟,中文资料少,遇到问题基本只能啃英文文档。在对稳定性要求极高的生产系统里,我个人还是会优先选PyQt。


4️⃣ wxPython —— 老实人,不出彩也不出错

wxPython用的是原生系统控件,界面风格跟Windows系统融合度最高。如果客户对"软件看起来要像Windows原生程序"有执念,wxPython是个不错的选择。

性能中规中矩,生态比Dear PyGui成熟,但比PyQt弱一些。现在新项目选它的人越来越少了,但维护老项目时经常会遇到。


📊 选型决策矩阵

维度
PyQt5/6
tkinter
Dear PyGui
wxPython
实时性能
★★★★★
★★☆☆☆
★★★★★
★★★☆☆
学习成本
★★★☆☆
★★★★★
★★★☆☆
★★★☆☆
自定义控件
★★★★★
★★☆☆☆
★★★★☆
★★★☆☆
生态成熟度
★★★★★
★★★★☆
★★★☆☆
★★★★☆
商业授权
需购买*
免费
免费
免费
Windows兼容
极佳
良好
良好
极佳

*注:PySide6是Qt官方的Python绑定,LGPL授权,商业免费,功能与PyQt6基本一致,可作替代。


🚀 架构建议:别让GUI成为瓶颈

选好框架只是第一步。工控上位机最容易出问题的地方,往往不是框架本身,而是把数据采集和界面更新混在一起写

正确的做法是分层:

python1import threading2import queue3from PyQt5.QtCore import QTimer45class DataAcquisitionThread(threading.Thread):6"""数据采集线程 - 独立于UI运行"""78def __init__(self, data_queue: queue.Queue):9super().__init__(daemon=True)10        self.data_queue = data_queue11        self._stop_event = threading.Event()1213def run(self):14while not self._stop_event.is_set():15# 这里放串口读取、Modbus查询等IO操作16# IO操作绝对不能放在主线程里17            data = self._read_device()1819# 用队列安全地传递数据给UI线程20try:21                self.data_queue.put_nowait(data)22except queue.Full:23pass  # 丢弃过期数据,保证实时性2425            self._stop_event.wait(timeout=0.1)  # 100ms采集间隔2627def _read_device(self):28# 实际项目替换为真实设备通信29import random30return {"temperature"75 + random.gauss(02),31"pressure"6.0 + random.gauss(00.1)}3233def stop(self):34        self._stop_event.set()353637class MainWindow(QMainWindow):38def __init__(self):39super().__init__()40        self.data_queue = queue.Queue(maxsize=100)4142# 启动采集线程43        self.daq_thread = DataAcquisitionThread(self.data_queue)44        self.daq_thread.start()4546# UI刷新定时器(只负责从队列取数据并更新界面)47        self.ui_timer = QTimer()48        self.ui_timer.timeout.connect(self._refresh_ui)49        self.ui_timer.start(50)  # 50ms刷新一次界面5051def _refresh_ui(self):52"""UI线程只做界面更新,不做任何IO"""53try:54while True:  # 清空队列积压55                data = self.data_queue.get_nowait()56                self._update_display(data)57except queue.Empty:58pass5960def _update_display(self, data):61# 更新界面控件62pass6364def closeEvent(self, event):65        self.daq_thread.stop()66        event.accept()

这个模式——采集线程负责IO,主线程只管渲染——是工控上位机开发的基本功。违反这个原则,界面卡顿和数据丢失是迟早的事。


💡 三句话总结

1. 中大型工控项目,PyQt5/PySide6是最稳妥的选择,别因为"看起来复杂"就退缩。

2. 高频多通道数据显示,记得把matplotlib换成pyqtgraph,这一步能让你的界面从PPT变成流畅动画。

3. 无论选哪个框架,IO操作和UI渲染必须分线程,这是工控软件稳定运行的铁律。


🔖 相关技术标签

#Python工控开发#PyQt5实战#上位机开发#工业自动化#GUI框架选型


欢迎在评论区聊聊你在工控界面开发中踩过的坑,或者分享你目前在用的框架和遇到的问题——这类实战经验往往比文档更有价值。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 10:54:43 HTTP/2.0 GET : https://f.mffb.com.cn/a/498106.html
  2. 运行时间 : 0.101227s [ 吞吐率:9.88req/s ] 内存消耗:4,683.26kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=16ffdd479237c501ca5b40305902e5e0
  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.000655s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000825s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000350s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000274s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000495s ]
  6. SELECT * FROM `set` [ RunTime:0.000197s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000612s ]
  8. SELECT * FROM `article` WHERE `id` = 498106 LIMIT 1 [ RunTime:0.000615s ]
  9. UPDATE `article` SET `lasttime` = 1783047283 WHERE `id` = 498106 [ RunTime:0.019621s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000363s ]
  11. SELECT * FROM `article` WHERE `id` < 498106 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000504s ]
  12. SELECT * FROM `article` WHERE `id` > 498106 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000435s ]
  13. SELECT * FROM `article` WHERE `id` < 498106 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000734s ]
  14. SELECT * FROM `article` WHERE `id` < 498106 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003519s ]
  15. SELECT * FROM `article` WHERE `id` < 498106 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001760s ]
0.102883s