当前位置:首页>python>告别Matplotlib!Python量化分析神器PyQtGraph入门指南

告别Matplotlib!Python量化分析神器PyQtGraph入门指南

  • 2026-03-25 09:45:26
告别Matplotlib!Python量化分析神器PyQtGraph入门指南

在Python量化分析和股票可视化领域,你是否还在为Matplotlib的性能瓶颈而烦恼?今天我要介绍一个高性能、交互性强的可视化库——PyQtGraph,它能够轻松处理百万级数据,是金融数据分析的绝佳选择。

为什么选择PyQtGraph?

PyQtGraph是基于PyQt/PySide和numpy构建的纯Python图形和GUI库,专为科学/工程应用设计。相比于Matplotlib,它具有以下优势:

  • 性能卓越:使用OpenGL进行硬件加速渲染,能够流畅显示百万级数据点

  • 交互性强:内置丰富的交互功能,如缩放、平移、十字光标等

  • 易于集成:完美集成到PyQt应用程序中,支持自定义控件

  • 实时更新:适合实时数据监控和交易系统

完整的股票K线图实现

下面是一个完整的股票K线图可视化工具实现,包含了K线图、交易量图、十字光标、交互控制等专业功能。

1. 核心架构设计

import sysimport pandas as pdfrom PyQt6.QtWidgets import QApplicationQLabelQMainWindowQMenuQStatusBarQToolBarQVBoxLayoutQWidgetfrom PyQt6.QtCore import Qtfrom PyQt6.QtGui import QActionQKeySequenceimport pyqtgraph as pgimport numpy as np

2. 自定义K线图项

PyQtGraph允许我们自定义图形项,这里实现了专业的K线图绘制:

class CandlestickItem(pg.GraphicsObject):    def __init__(self, data):        pg.GraphicsObject.__init__(self)        self.data = data        self.generatePicture()    def generatePicture(self):        """生成K线图绘制指令,优化性能的关键"""        self.picture = pg.QtGui.QPicture()        p = pg.QtGui.QPainter(self.picture)        p.setPen(pg.mkPen("w"))        # 计算K线宽度        w = 0.6 if len(self.data) > 1 else 0.8        for (t, open_price, close_price, low_price, high_price) in self.data:            # 涨跌颜色:红色表示跌,绿色表示涨            if open_price > close_price:                p.setBrush(pg.mkBrush("r"))            else:                p.setBrush(pg.mkBrush("g"))            # 绘制K线实体            rect_top = min(open_price, close_price)            rect_height = abs(close_price - open_price)            p.drawRect(pg.QtCore.QRectF(                t - w/2,     # 矩形左边界                rect_top,    # 矩形顶部                w,           # 矩形宽度                rect_height  # 矩形高度            ))            # 绘制上下影线            p.drawLine(                pg.QtCore.QPointF(t, low_price),                pg.QtCore.QPointF(t, high_price)            )        p.end()    def paint(self, p, *args):        p.drawPicture(00self.picture)    def boundingRect(self):        return pg.QtCore.QRectF(self.picture.boundingRect())
技术要点:
  • 使用QPicture预渲染图形,提升绘制性能

  • 涨跌用红绿颜色区分,符合金融行业惯例

  • 实体部分表示开盘收盘价,影线表示最高最低价

3. 智能十字光标系统

十字光标是金融图表的重要功能,能够精确定位数据点:

class Crosshair:    def __init__(self, viewer, kline_plot, volume_plot):        self.viewer = viewer        self.kline_plot = kline_plot        self.volume_plot = volume_plot        # 创建十字线        self.vLine = pg.InfiniteLine(            angle=90, movable=False            pen=pg.mkPen("yellow", width=1)        )        self.hLine = pg.InfiniteLine(            angle=0, movable=False,            pen=pg.mkPen("yellow", width=1)        )        # 添加到图表        kline_plot.addItem(self.vLine, ignoreBounds=True)        kline_plot.addItem(self.hLine, ignoreBounds=True)        volume_plot.addItem(self.vLine, ignoreBounds=True)        # 信息标签        self.label = pg.TextItem(anchor=(01))        self.label.setParentItem(kline_plot.getViewBox())        self.label.setVisible(False)        kline_plot.addItem(self.label)        # 连接鼠标事件        self.kline_plot.scene().sigMouseMoved.connect(self.mouse_moved)        self.kline_plot.scene().sigMouseClicked.connect(self.mouse_clicked)    def mouse_moved(self, pos):        """实时更新十字光标位置和数据显示"""        if not self.enabled:            return        mouse_point = self.kline_plot.getViewBox().mapSceneToView(pos)        x_range = self.kline_plot.getViewBox().viewRange()[0]        y_range = self.kline_plot.getViewBox().viewRange()[1]        # 检查鼠标是否在视图内        if x_range[0] <= mouse_point.x() <= x_range[1and y_range[0] <= mouse_point.y() <= y_range[1]:            self.vLine.setPos(mouse_point.x())            self.hLine.setPos(mouse_point.y())            # 显示详细信息            x_val = int(round(mouse_point.x()))            y_val = float(f"{mouse_point.y():.4f}")            if 0 <= x_val < len(self.viewer.date_labels):                date = self.viewer.date_labels.iloc[x_val]                date_str = date.strftime("%Y-%m-%d"if hasattr(date, "strftime"else str(date)                self.label.setText(f"Date:{date_str}\nPrice:{y_val}", color="w")                self.label.setPos(mouse_point.x(), mouse_point.y())                self.label.setVisible(True)    def mouse_clicked(self, evt):        """右键点击切换光标显示"""        if evt.button() == Qt.MouseButton.RightButton:            self.enabled = not self.enabled            self.vLine.setVisible(self.enabled)            self.hLine.setVisible(self.enabled)            self.label.setVisible(self.enabled)
技术要点:
  • 使用InfiniteLine创建无限延伸的十字线

  • 实时计算鼠标位置并转换为数据坐标

  • 智能显示日期和价格信息

4. 主窗口和交互控制

class StockChartViewer(QMainWindow):    def __init__(self, data):        super().__init__()        self.data = data.copy()        self.date_labels = []        self.crosshair = None        self.init_ui()        self.init_toolbar()    def init_ui(self):        """初始化用户界面"""        self.setWindowTitle("股票数据分析")        self.setGeometry(1001001400900)        # 设置中心部件        central_widget = QWidget()        self.setCentralWidget(central_widget)        main_layout = QVBoxLayout(central_widget)        main_layout.setContentsMargins(0000)        # 创建图形布局部件        self.graphics_widget = pg.GraphicsLayoutWidget()        main_layout.addWidget(self.graphics_widget)        # 状态栏        self.status_bar = QStatusBar()        self.setStatusBar(self.status_bar)        self.status_label = QLabel(            "就绪 | 左键:拖动 | 右键:菜单 | 滚轮:缩放 | 右键双击:重置 | 右键点击:切换十字光标"        )        self.status_bar.addWidget(self.status_label)        # 启用抗锯齿        pg.setConfigOptions(antialias=True)        self.plot_charts()    def plot_charts(self):        """绘制K线图和交易量图"""        # 处理日期数据        if "date" in self.data.columns:            if not pd.api.types.is_datetime64_any_dtype(self.data["date"]):                self.data["date"] = pd.to_datetime(self.data["date"])            self.date_labels = self.data["date"].copy()            self.dates_numeric = np.arange(len(self.data))        # 获取数据        dates_numeric = self.dates_numeric        o = self.data["open"].values        h = self.data["high"].values        l = self.data["low"].values        c = self.data["close"].values        volume = self.data["amount"].values        # 创建K线图        self.kline_plot = self.graphics_widget.addPlot(            title="K线图", row=0, col=0        )        self.kline_plot.addLegend()        # 设置坐标轴范围        if len(dates_numeric) > 0:            x_min, x_max = dates_numeric.min(), dates_numeric.max()            self.kline_plot.setXRange(x_min, x_max, padding=0.1)            price_min = min(o.min(), h.min(), l.min(), c.min())            price_max = max(o.max(), h.max(), l.max(), c.max())            self.kline_plot.setYRange(price_min * 0.95, price_max * 1.05, padding=0.1)        # 创建K线数据        candlestick_data = []        for i in range(len(dates_numeric)):            candlestick_data.append((                float(dates_numeric[i]),                 float(o[i]),                 float(c[i]),                 float(l[i]),                 float(h[i])            ))        candlestick_item = CandlestickItem(candlestick_data)        self.kline_plot.addItem(candlestick_item)        # 设置图表属性        self.kline_plot.setLabel("left""价格")        self.kline_plot.setLabel("bottom""日期")        self.kline_plot.showGrid(x=True, y=True, alpha=0.3)        self.kline_plot.setMouseEnabled(x=True, y=True)        # 设置X轴标签        self.set_x_axis_labels(self.kline_plot)        # 创建交易量图        self.volume_plot = self.add_volume_chart(            dates_numeric, volume, o, c, 1self.kline_plot        )        # 初始化十字光标        self.crosshair = Crosshair(selfself.kline_plot, self.volume_plot)        self.kline_plot.scene().sigMouseMoved.connect(self.update_status_bar)    def add_volume_chart(self, dates, volume, open_prices, close_prices, row, linked_plot):        """添加交易量图"""        volume_plot = self.graphics_widget.addPlot(title="交易量", row=row, col=0)        volume_plot.setXLink(linked_plot)  # 链接X轴        volume_plot.setMouseEnabled(x=True, y=True)        # 绘制交易量柱状图        bar_width = 0.6 if len(dates) > 1 else 0.8        for i, (date, vol, open_price, close_price) in enumerate(            zip(dates, volume, open_prices, close_prices)        ):            color = "g" if close_price >= open_price else "r"            brush = pg.mkBrush(color)            bar = pg.BarGraphItem(                x=[date], height=[vol], width=bar_width, brush=brush            )            volume_plot.addItem(bar)        # 设置坐标轴        self.set_x_axis_labels(volume_plot)        volume_plot.setLabel("left""交易量")        volume_plot.setLabel("bottom""日期")        volume_plot.showGrid(x=True, y=True, alpha=0.3)        return volume_plot

5. 完整的交互工具栏

def init_toolbar(self):    """初始化工具栏,提供丰富的交互功能"""    toolbar = QToolBar("主工具栏")    self.addToolBar(toolbar)    # 重置视图按钮    reset_action = QAction("重置视图", self)    reset_action.setStatusTip("重置视图到初始状态")    reset_action.triggered.connect(self.reset_view)    reset_action.setShortcut("R")    toolbar.addAction(reset_action)    toolbar.addSeparator()    # 十字光标开关    crosshair_action = QAction("十字光标", self)    crosshair_action.setStatusTip("显示/隐藏十字光标")    crosshair_action.setCheckable(True)    crosshair_action.setChecked(True)    crosshair_action.triggered.connect(self.toggle_crosshair)    crosshair_action.setShortcut("C")    toolbar.addAction(crosshair_action)    toolbar.addSeparator()    # 缩放模式    zoom_x_action = QAction("X轴缩放", self)    zoom_x_action.setStatusTip("启用X轴缩放")    zoom_x_action.setCheckable(True)    zoom_x_action.setChecked(False)    zoom_x_action.triggered.connect(lambda: self.set_zoom_mode("x"))    toolbar.addAction(zoom_x_action)    zoom_y_action = QAction("Y轴缩放", self)    zoom_y_action.setStatusTip("启用Y轴缩放")    zoom_y_action.setCheckable(True)    zoom_y_action.setChecked(False)    zoom_y_action.triggered.connect(lambda: self.set_zoom_mode("y"))    toolbar.addAction(zoom_y_action)    zoom_xy_action = QAction("XY轴缩放", self)    zoom_xy_action.setStatusTip("启用XY轴缩放")    zoom_xy_action.setCheckable(True)    zoom_xy_action.setChecked(True)    zoom_xy_action.triggered.connect(lambda: self.set_zoom_mode("xy"))    toolbar.addAction(zoom_xy_action)    toolbar.addSeparator()    # 鼠标模式    pan_action = QAction("平移模式", self)    pan_action.setStatusTip("启用平移模式")    pan_action.setCheckable(True)    pan_action.setChecked(True)    pan_action.triggered.connect(lambda: self.set_mouse_mode("pan"))    pan_action.setShortcut("P")    toolbar.addAction(pan_action)    zoom_action = QAction("缩放模式", self)    zoom_action.setStatusTip("启用缩放模式")    zoom_action.setCheckable(True)    zoom_action.setChecked(False)    zoom_action.triggered.connect(lambda: self.set_mouse_mode("zoom"))    zoom_action.setShortcut("Z")    toolbar.addAction(zoom_action)    toolbar.addSeparator()    # 显示设置    show_grid_action = QAction("显示网格", self)    show_grid_action.setStatusTip("显示/隐藏网格")    show_grid_action.setCheckable(True)    show_grid_action.setChecked(True)    show_grid_action.triggered.connect(self.toggle_grid)    toolbar.addAction(show_grid_action)

6. 上下文菜单和快捷键

def create_context_menu(self, ev):    """创建右键上下文菜单"""    menu = QMenu()    reset_action = menu.addAction("重置视图(R)")    reset_action.triggered.connect(self.reset_view)    menu.addSeparator()    # 十字光标选项    crosshair_action = menu.addAction("切换十字光标 (C)")    crosshair_action.setCheckable(True)    crosshair_action.setChecked(self.crosshair.enabled)    crosshair_action.triggered.connect(self.toggle_crosshair)    menu.addSeparator()    # 缩放选项    menu.addAction("X轴缩放").triggered.connect(lambdaself.set_zoom_mode('x'))    menu.addAction("Y轴缩放").triggered.connect(lambdaself.set_zoom_mode('y'))    menu.addAction("XY轴缩放").triggered.connect(lambdaself.set_zoom_mode('xy'))    menu.addSeparator()    # 鼠标模式    menu.addAction("平移模式 (P)").triggered.connect(lambdaself.set_mouse_mode('pan'))    menu.addAction("缩放模式 (Z)").triggered.connect(lambdaself.set_mouse_mode('zoom'))    menu.addSeparator()    # 网格显示    grid_action = menu.addAction("显示网格")    grid_action.setCheckable(True)    grid_action.setChecked(self.kline_plot.ctrl.gridCheck.isChecked())    grid_action.triggered.connect(self.toggle_grid)    return menudef keyPressEvent(self, event):    """键盘快捷键支持"""    if event.key() == Qt.Key.Key_R:        self.reset_view()    elif event.key() == Qt.Key.Key_C:        self.toggle_crosshair()    elif event.key() == Qt.Key.Key_Z:        self.set_mouse_mode('zoom')    elif event.key() == Qt.Key.Key_P:        self.set_mouse_mode('pan')    elif event.key() == Qt.Key.Key_G:        self.toggle_grid()    elif event.key() == Qt.Key.Key_Escape:        self.reset_view()    else:        super().keyPressEvent(event)

7. 主程序入口

def main():    app = QApplication(sys.argv)    app.setStyle("Fusion")  # 使用Fusion风格,跨平台一致性更好    # 假设从get_stock_data模块导入数据    from get_stock_data import df    viewer = StockChartViewer(df)    viewer.show()    sys.exit(app.exec())if __name__ == "__main__":    main()

PyQtGraph核心技术要点总结

1. 性能优化技巧

  • 使用QPicture预渲染CandlestickItem中使用QPicture提前生成绘制指令

  • 批量绘制:尽量使用向量化操作,避免在循环中单独绘制

  • 硬件加速:PyQtGraph默认使用OpenGL进行硬件加速渲染

2. 交互设计要点

  • 信号槽机制:合理使用sigMouseMovedsigMouseClicked等信号

  • 视图链接:通过setXLink()链接多个图表的X轴

  • 坐标转换:使用mapSceneToView()将屏幕坐标转换为数据坐标

3. 用户体验优化

  • 丰富的快捷键:R重置、C十字光标、Z缩放模式、P平移模式

  • 智能状态栏:实时显示鼠标位置对应的数据

  • 上下文菜单:右键菜单提供常用功能快速访问

4. 数据可视化最佳实践

  • 颜色语义化:红跌绿涨,符合金融行业惯例

  • 坐标轴优化:智能刻度标签,避免标签重叠

  • 多图联动:K线图与交易量图同步缩放和平移

总结

PyQtGraph为Python量化分析提供了一个强大而灵活的可视化解决方案。通过本文的完整示例,你可以看到如何构建一个专业的股票分析工具,包括:

  1. 高性能K线图绘制:支持大量数据点的流畅显示

  2. 完整的交互功能:缩放、平移、十字光标、快捷键

  3. 专业的数据展示:K线图+交易量图的经典组合

  4. 良好的用户体验:状态栏提示、上下文菜单、工具栏

相比于Matplotlib,PyQtGraph在交互性和性能方面有明显优势,特别适合需要实时数据更新和复杂交互的金融应用。如果你正在开发量化交易系统、数据分析工具或需要高性能的可视化应用,PyQtGraph绝对值得尝试。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-27 09:53:28 HTTP/2.0 GET : https://f.mffb.com.cn/a/481691.html
  2. 运行时间 : 0.187268s [ 吞吐率:5.34req/s ] 内存消耗:4,587.37kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=57b5ba08ea137031ada37a3c9f74b797
  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.001032s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001551s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000649s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000625s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001186s ]
  6. SELECT * FROM `set` [ RunTime:0.000557s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001531s ]
  8. SELECT * FROM `article` WHERE `id` = 481691 LIMIT 1 [ RunTime:0.003700s ]
  9. UPDATE `article` SET `lasttime` = 1774576409 WHERE `id` = 481691 [ RunTime:0.005541s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000573s ]
  11. SELECT * FROM `article` WHERE `id` < 481691 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002084s ]
  12. SELECT * FROM `article` WHERE `id` > 481691 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001076s ]
  13. SELECT * FROM `article` WHERE `id` < 481691 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002976s ]
  14. SELECT * FROM `article` WHERE `id` < 481691 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002645s ]
  15. SELECT * FROM `article` WHERE `id` < 481691 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.005344s ]
0.190957s