乐于分享
好东西不私藏

Qt QPA 插件开发:选择机制与 minimal 插件实现详解

Qt QPA 插件开发:选择机制与 minimal 插件实现详解

一、引言:什么是 Qt 平台抽象 (QPA)?

作为 Qt 跨平台能力的底层核心,Qt Platform Abstraction 提供了一套“平台无关的接口,换平台不换代码”的抽象层。它通过一套以 QPlatform* 为前缀的 C++ 接口,将所有与底层操作系统、窗口系统和图形硬件相关的差异封装起来——例如 QPlatformWindow 对应上层的 QWindowQPlatformTheme 对应 QStyle 和主题集成。这套抽象层的核心价值在于:

  • 当某个上层功能需要访问系统窗口特性时,Qt GUI 模块只调用 QPA 的标准接口。
  • 具体实现则根据当前运行的平台,由对应的 QPA 插件来提供。

二、核心架构:QPA 的两大基石

一个完整的 QPA 插件主要围绕两个“根类”构建:**QPlatformIntegration** 和 **QPlatformTheme**。

  1. QPlatformIntegration——窗口系统集成它充当窗口系统的统一入口点,负责创建和管理以下组件:窗口 (QPlatformWindow)、屏幕 (QPlatformScreen)、OpenGL 上下文 (QPlatformOpenGLContext)、剪贴板 (QPlatformClipboard)、拖放 (QPlatformDrag)、输入法上下文 (QPlatformInputContext) 等。

  2. QPlatformTheme——平台主题与样式负责特定平台的外观表现和用户体验:平台调色板、字体、主题提示、本地对话框、菜单栏和菜单项等。

QStyle 不属于 QPA 的一部分,它位于 QPA 抽象层之上。在 Qt 源码中,搜索 *_qpa.h*_qpa.cpp*_qpa_p.h 即可找到所有和 QPA 有关的接口定义。


三、选择 QPA 插件:QT_QPA_PLATFORM 与 -platform

根据目标平台,Qt 会自动加载对应的插件(如 qwindowsqcocoaqxcb 等)。如需手动干预选择,可通过两种方式:

选择方式
用法示例
说明
环境变量
export QT_QPA_PLATFORM=xcb
全局影响,适合运行前配置
命令行参数
./myapp -platform wayland
临时指定,优先级更高
嵌入代码(Qt 6)
qputenv("QT_QPA_PLATFORM", "offscreen");
必须在 QApplication 构造前执行

⚠️ Qt 6 重要变化QT_QPA_PLATFORM 必须在 QCoreApplication 实例化之前设置,因为平台插件选择在应用程序初始化早期完成。

#include<QGuiApplication>
#include<QWindow>
#include<QDebug>
#include<cstdlib>

intmain(int argc, char *argv[])
{
// 方式1:在应用创建前通过环境变量设置(可选)
// 取消注释以强制使用 offscreen 插件
// qputenv("QT_QPA_PLATFORM", "offscreen");

QGuiApplication app(argc, argv);

// 运行时检查当前使用的 QPA 插件名称
const QString platformName = QGuiApplication::platformName();
    qDebug() << "当前使用的 QPA 插件:" << platformName;

// 验证常见插件
if (platformName == "xcb")
        qDebug() << "→ 运行在 X11 环境";
elseif (platformName == "wayland")
        qDebug() << "→ 运行在 Wayland 环境";
elseif (platformName == "windows")
        qDebug() << "→ 运行在 Windows 环境";
elseif (platformName == "cocoa")
        qDebug() << "→ 运行在 macOS 环境";
elseif (platformName == "offscreen")
        qDebug() << "→ 运行在离屏(无头)模式,无窗口显示";

// 创建一个简单窗口
    QWindow window;
    window.setTitle(QString("QPA 插件: %1").arg(platformName));
    window.resize(400300);
    window.show();

return app.exec();
}

运行示例

# 使用环境变量选择 X11 插件
export QT_QPA_PLATFORM=xcb
./myapp
# 输出: 当前使用的 QPA 插件:xcb → 运行在 X11 环境

# 使用环境变量选择 Wayland 插件
export QT_QPA_PLATFORM=wayland
./myapp
# 输出: 当前使用的 QPA 插件:wayland → 运行在 Wayland 环境

# 使用命令行参数选择离屏插件(无窗口,仅用于测试)
./myapp -platform offscreen
# 输出: 当前使用的 QPA 插件:offscreen → 运行在离屏模式

四、Minimal 插件:最简单的 QPA 示例

编写 QPA 插件时,官方建议参考两个最小实现:minimal 插件和 minimalegl 插件。minimal 插件特别适合作为模板,因为它在复杂性和完整性之间找到了最佳平衡点——基于软件渲染(通过内存中的 QImage 完成),不依赖 OpenGL,不需要实际的窗口系统,但仍然完整地实现了插件加载、基本窗口管理和屏幕管理所必需的类。其关键功能包括:

  • 将绘制内容转储到由环境变量指定的图像文件中,用于诊断。
  • 输出帧缓存快照的功能,在调试离屏渲染或自动化测试时非常有价值。

4.1 插件的工程文件 (.pro)

TEMPLATE = lib
CONFIG += plugin
TARGET = $$qtLibraryTarget(myqpaplugin)

# 指定插件安装路径
target.path = $$[QT_INSTALL_PLUGINS]/platforms
INSTALLS += target

HEADERS += myqpaintegration.h \
           myqpaintegrationplugin.h

SOURCES += myqpaintegration.cpp \
           myqpaintegrationplugin.cpp

# 链接 Qt 必要的模块
QT += core gui

4.2 插件类:QPlatformIntegrationPlugin 子类

QPA 插件使用 Qt 的插件系统,插件类必须继承自 QPlatformIntegrationPlugin 并实现 keys() 和 create() 方法:

// myqpaintegrationplugin.h
#ifndef MYQPAINTEGRATIONPLUGIN_H
#define MYQPAINTEGRATIONPLUGIN_H

#include<qpa/qplatformintegrationplugin.h>

classMyQpaIntegrationPlugin :public QPlatformIntegrationPlugin
{
    Q_OBJECT
// Q_PLUGIN_METADATA 宏将插件标识符 IID 与 json 描述文件关联
// QPlatformIntegrationPlugin_iid 由 Qt 定义,固定为 "org.qt-project.Qt.QPlatformIntegrationFactoryInterface.5.1"
    Q_PLUGIN_METADATA(IID QPlatformIntegrationFactoryInterface_iid FILE "myqpa.json")

public:
// keys() 返回该插件能够处理的插件标识符字符串列表(如 "myqpa", "myqpa:software")
QStringList keys()constoverride;

// create() 根据 key 和参数列表创建实际的 QPlatformIntegration 对象
QPlatformIntegration *create(const QString& key, const QStringList& paramList)override;
};

#endif// MYQPAINTEGRATIONPLUGIN_H
// myqpaintegrationplugin.cpp
#include"myqpaintegrationplugin.h"
#include"myqpaintegration.h"

QStringList MyQpaIntegrationPlugin::keys()const
{
// 该插件支持的插件名称列表
// 当用户通过 QT_QPA_PLATFORM=myqpa 或 -platform myqpa 指定时,Qt 会匹配此字符串
return QStringList() << "myqpa";
}

QPlatformIntegration *MyQpaIntegrationPlugin::create(const QString& key, const QStringList& paramList)
{
// 检查请求的 key 是否匹配本插件支持的名称
if (key.toLower() == "myqpa")
// 传递参数列表给 QPlatformIntegration 构造函数,用于平台特定的初始化
returnnew MyQpaIntegration(paramList);

returnnullptr;
}

配套的 JSON 描述文件 myqpa.json

{
"Keys": ["myqpa"]
}

Qt 的插件加载机制通过 QPlatformIntegrationFactoryQPlatformIntegrationPlugin 和 QPlatformIntegration 三类协同工作:工厂类负责加载所有匹配的插件,插件类通过 Q_PLUGIN_METADATA 宏暴露元信息,集成类提供实际功能。

4.3 集成类:QPlatformIntegration 子类

// myqpaintegration.h
#ifndef MYQPAINTEGRATION_H
#define MYQPAINTEGRATION_H

#include<qpa/qplatformintegration.h>
#include<qpa/qplatformnativeinterface.h>

QT_BEGIN_NAMESPACE

classMyQpaScreen;

classMyQpaIntegration :public QPlatformIntegration
{
public:
explicitMyQpaIntegration(const QStringList& paramList);
    ~MyQpaIntegration();

// 必须实现的基础组件创建接口
QPlatformWindow *createPlatformWindow(QWindow *window)constoverride;
QPlatformBackingStore *createPlatformBackingStore(QWindow *window)constoverride;
QPlatformOpenGLContext *createPlatformOpenGLContext(QOpenGLContext *context)constoverride;
QPlatformFontDatabase *fontDatabase()constoverride;

// 屏幕管理接口
QPlatformScreen *screen()constreturn m_primaryScreen; }

// 提供原生接口访问(虽然不是必需的,但很多 Qt 代码假设它存在)
QPlatformNativeInterface *nativeInterface()constoverride;

private:
    QPlatformScreen *m_primaryScreen;
    QPlatformFontDatabase *m_fontDatabase;
    QPlatformNativeInterface *m_nativeInterface;
    QStringList m_params;
};

QT_END_NAMESPACE

#endif// MYQPAINTEGRATION_H
// myqpaintegration.cpp
#include"myqpaintegration.h"
#include"myqpascreen.h"
#include"myqpawindow.h"
#include"myqpabackingstore.h"
#include<qpa/qplatformopenglcontext.h>
#include<QtGui/private/qgenericunixfontdatabase_p.h>

MyQpaIntegration::MyQpaIntegration(const QStringList& paramList)
    : m_params(paramList)
{
// 解析参数列表(例如通过 -platform myqpa:someparam=value 传递)
// 简化版本:忽略参数

// 创建并添加主屏幕
    m_primaryScreen = new MyQpaScreen();
    screenAdded(m_primaryScreen);

// 创建字体数据库(复用 Unix 通用实现以简化)
    m_fontDatabase = new QGenericUnixFontDatabase();

// 提供本地接口(Minimal 插件经验表明,虽然不提供本地 API,
// 但仍需返回一个有效对象,否则 Qt 某些代码会崩溃)
    m_nativeInterface = new QPlatformNativeInterface();
}

MyQpaIntegration::~MyQpaIntegration()
{
delete m_primaryScreen;
delete m_fontDatabase;
delete m_nativeInterface;
}

QPlatformWindow *MyQpaIntegration::createPlatformWindow(QWindow *window)const
{
returnnew MyQpaWindow(window);
}

QPlatformBackingStore *MyQpaIntegration::createPlatformBackingStore(QWindow *window)const
{
// 返回基于软件渲染的后端存储
returnnew MyQpaBackingStore(window);
}

QPlatformOpenGLContext *MyQpaIntegration::createPlatformOpenGLContext(QOpenGLContext *context)const
{
// 如果不支持 OpenGL,返回 nullptr
// 但需要在日志中记录
    qWarning("MyQPA: OpenGL not supported in this minimal plugin");
returnnullptr;
}

QPlatformFontDatabase *MyQpaIntegration::fontDatabase()const
{
return m_fontDatabase;
}

QPlatformNativeInterface *MyQpaIntegration::nativeInterface()const
{
return m_nativeInterface;
}

4.4 屏幕类:QPlatformScreen 子类

// myqpascreen.h
#ifndef MYQPASCREEN_H
#define MYQPASCREEN_H

#include<qpa/qplatformscreen.h>
#include<QRect>

classMyQpaScreen :public QPlatformScreen
{
public:
    MyQpaScreen();
    ~MyQpaScreen();

QRect geometry()constoverride;
intdepth()constoverride;
QImage::Format format()constoverride;

private:
    QRect m_geometry;
};

#endif
// myqpascreen.cpp
#include"myqpascreen.h"

MyQpaScreen::MyQpaScreen()
    : m_geometry(00800600)  // 默认 800x600 分辨率
{
// 屏幕可用性通知将在构造完成后通过父 Integration 类的 screenAdded() 发送
}

MyQpaScreen::~MyQpaScreen()
{
}

QRect MyQpaScreen::geometry()const
{
return m_geometry;
}

intMyQpaScreen::depth()const
{
return32;
}

QImage::Format MyQpaScreen::format()const
{
// 使用标准的 32 位 RGB 格式
return QImage::Format_RGB32;
}

4.5 窗口类:QPlatformWindow 子类

// myqpawindow.h
#ifndef MYQPAWINDOW_H
#define MYQPAWINDOW_H

#include<qpa/qplatformwindow.h>

classMyQpaWindow :public QPlatformWindow
{
public:
    MyQpaWindow(QWindow *window);
    ~MyQpaWindow();

voidsetGeometry(const QRect &rect)override;
voidsetVisible(bool visible)override;

// 可选:提供窗口内容转储功能
voiddumpWindowContent()const;
};

#endif
// myqpawindow.cpp
#include"myqpawindow.h"
#include<QDebug>
#include<QImage>
#include<QDateTime>

MyQpaWindow::MyQpaWindow(QWindow *window)
    : QPlatformWindow(window)
{
    qDebug() << "MyQPA: Window created";
}

MyQpaWindow::~MyQpaWindow()
{
}

voidMyQpaWindow::setGeometry(const QRect &rect)
{
    QPlatformWindow::setGeometry(rect);
    qDebug() << "MyQPA: Window geometry set to" << rect;
}

voidMyQpaWindow::setVisible(bool visible)
{
    qDebug() << "MyQPA: Window visibility changed to" << visible;
    QPlatformWindow::setVisible(visible);
}

4.6 后备存储:QPlatformBackingStore 子类

// myqpabackingstore.h
#ifndef MYQPABACKINGSTORE_H
#define MYQPABACKINGSTORE_H

#include<qpa/qplatformbackingstore.h>
#include<QImage>

classMyQpaBackingStore :public QPlatformBackingStore
{
public:
    MyQpaBackingStore(QWindow *window);
    ~MyQpaBackingStore();

QPaintDevice *paintDevice()override;
voidflush(QWindow *window, const QRegion &region, const QPoint &offset)override;
voidresize(const QSize &size, const QRegion &staticContents)override;

private:
    QImage m_image;
};

#endif
// myqpabackingstore.cpp
#include"myqpabackingstore.h"
#include"myqpawindow.h"
#include<QPainter>
#include<QDebug>

MyQpaBackingStore::MyQpaBackingStore(QWindow *window)
    : QPlatformBackingStore(window)
{
}

MyQpaBackingStore::~MyQpaBackingStore()
{
}

QPaintDevice *MyQpaBackingStore::paintDevice()
{
return &m_image;
}

voidMyQpaBackingStore::flush(QWindow *window, const QRegion &region, const QPoint &offset)
{
    Q_UNUSED(region)
    Q_UNUSED(offset)

// 模拟将图像内容呈现到屏幕上
// 在实际实现中,这里可能会:写入帧缓冲、复制到窗口表面、或转储到文件

if (MyQpaWindow *platformWindow = static_cast<MyQpaWindow*>(window->handle())) {
        Q_UNUSED(platformWindow)
// 可以将 m_image 的内容拷贝到实际的显示内存
    }

    qDebug() << "MyQPA: BackingStore flushed, image size:" << m_image.size();
}

voidMyQpaBackingStore::resize(const QSize &size, const QRegion &staticContents)
{
    Q_UNUSED(staticContents)

if (m_image.size() != size) {
        m_image = QImage(size, QImage::Format_RGB32);
        m_image.fill(Qt::black);
        qDebug() << "MyQPA: BackingStore resized to" << size;
    }
}

4.7 编译与使用

  1. 使用 qmake 和 make 编译插件工程:

    qmake
    make
  2. 插件会被编译成动态库,安装到 Qt 的插件目录下:

    make install
    # 或者手动复制到 Qt 安装目录的 plugins/platforms 文件夹
  3. 使用自定义 QPA 插件运行应用程序:

    export QT_QPA_PLATFORM=myqpa
    ./my_qt_app

五、现实部署中的注意事项

5.1 纯离屏运行与调试

offscreen 插件与 minimal 插件的区别在于:offscreen 完全不依赖任何显示设备,适合在服务器或无头环境中运行 Qt 应用程序进行自动化测试。minimal 插件仍然会创建虚拟屏幕并执行绘制操作,绘制内容还可以通过 QT_QPA_MINIMAL_DUMP_IMAGE 和 QT_QPA_MINIMAL_DUMP_IMAGE_FORMAT 环境变量转存到文件中用于诊断。

5.2 常见问题排查

遇到"Could not load the Qt platform plugin"错误时,请检查:

  1. 插件路径缺失:确保 ${QT_INSTALL_PLUGINS}/platforms 目录在系统中可访问,或设置 QT_QPA_PLATFORM_PLUGIN_PATH 环境变量指向包含自定义插件的目录。
  2. 插件加载的整个流程:Qt 通过 QPlatformIntegrationFactory 加载所有匹配的插件,插件类通过 Q_PLUGIN_METADATA 宏暴露元信息。如果插件加载失败,可能是插件元数据与 Qt 版本不兼容。
  3. 回退排查:根据经验,使用最简单的可编译运行示例来排查问题非常高效,建议先验证插件能否被 keys() 正确匹配,再逐层检查其他依赖。

六、总结

Qt QPA 插件系统提供了一种优雅的方式来实现跨平台兼容性,从桌面操作系统到嵌入式 Linux 设备。本文通过理论解析和完整代码示例,阐述了 QPA 的核心架构、插件选择机制和实现方法。然而,由于 QPA 类的二进制兼容性限制,开发者必须针对其开发时所基于的特定 Qt 版本编译插件。如需更深入的技术细节,建议查阅 Qt 源码中的 minimal 和 minimalegl 插件实现作为参考范例。

掌握 QPA 插件开发的技能,不仅能够帮助解决特定的平台适配问题,更能深入理解 Qt 框架内部的工作原理,为构建跨平台的高性能应用提供坚实的技术基础。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-10 12:49:11 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/730143.html
  2. 运行时间 : 0.098921s [ 吞吐率:10.11req/s ] 内存消耗:4,853.19kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=bf5499c026587d3997e457a2c83e0a9a
  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.000689s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000765s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000366s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000274s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000468s ]
  6. SELECT * FROM `set` [ RunTime:0.000195s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000571s ]
  8. SELECT * FROM `article` WHERE `id` = 730143 LIMIT 1 [ RunTime:0.002187s ]
  9. UPDATE `article` SET `lasttime` = 1781066951 WHERE `id` = 730143 [ RunTime:0.010685s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000307s ]
  11. SELECT * FROM `article` WHERE `id` < 730143 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000727s ]
  12. SELECT * FROM `article` WHERE `id` > 730143 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000447s ]
  13. SELECT * FROM `article` WHERE `id` < 730143 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002535s ]
  14. SELECT * FROM `article` WHERE `id` < 730143 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001323s ]
  15. SELECT * FROM `article` WHERE `id` < 730143 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000929s ]
0.100715s