当前位置:首页>Linux>Windows 上跑得好好的,Linux 上崩了?跨平台适配的 10 个坑

Windows 上跑得好好的,Linux 上崩了?跨平台适配的 10 个坑

  • 2026-08-28 21:31:10
Windows 上跑得好好的,Linux 上崩了?跨平台适配的 10 个坑

Aether 跨平台实战记录


一、一个"完美"的周五下午

周五下午 4 点 57 分。我泡好咖啡,准备摸鱼下班。

Windows 上跑了两个月了,200 多个测试用例全部通过。CI 绿得像翡翠。客户下周一在 Linux 上部署,我跟领导拍胸脯说 Qt 是跨平台的,改个编译器就完事。

4 点 59 分。我 ssh 登上了 Linux 编译服务器。

mkdir build && cd build && cmake .. && make -j8

编译通过了。我笑了笑,Qt 的跨平台果然不是吹的。

5 点 03 分。./aether

段错误。

5 点 05 分。插件加载失败,日志全是乱码,信号没连上,明明存在的配置文件说找不到,socket 连接秒断,线程名变成了乱码,CloseEvent 没触发,析构走了一半炸了,core dump 文件占了 8 个 G。

5 点 30 分。咖啡凉了。我盯着满屏的 Segmentation fault,怀疑人生。

你不是一个人。

如果你也经历过"Windows 上一切正常,Linux 上全是 bug"的绝望,这篇就是给你看的。Aether 在跨平台适配过程中踩了刚好 10 个坑,一个不少。


二、10 个坑,每个都出过 bug

坑 1:路径分隔符——\ 还是 /

最蠢的 bug。最痛的代价。

// ❌ Windows 专用的硬编码
QString configPath = "D:\\aether\\config\\app.toml";
QFile file(configPath);
// Linux 上直接炸——目录不存在 / 路径里带反斜杠

// ✅ Qt 帮你跨平台
QString configPath = QStandardPaths::writableLocation(
    QStandardPaths::AppConfigLocation
) + "/app.toml";
// 或者用 QDir 的跨平台分隔符
QString configPath = QDir::toNativeSeparators(
    QCoreApplication::applicationDirPath()
    + "/../config/app.toml"
);

教训:永远不要手写路径。QDirQFileInfoQStandardPaths 这些类是 Qt 给你的保险。Windows 上反斜杠确实能跑,但换到 Linux 上就是 -1 返回值 + 一堆 File not found

坑 2:编码问题——GBK 和 UTF-8 打架

Windows 中文版上,Qt Creator 的默认编码是 GBK。你在代码里写了个中文注释,编译过去了。但在 Linux 上,GCC 默认用 UTF-8 解释源文件——中文字符串直接变成乱码。

// ❌ 源文件是 GBK 编码,Linux 上编译
QString title = tr("相机参数设置");
// Linux 运行结果:""(空字符串)或乱码

// ✅ 统一用 UTF-8 with BOM,明确定义编码
// 在 CMakeLists.txt 里加:
// add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
// add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
// 源文件另存为 UTF-8 with BOM
QString title = tr("相机参数设置");
// Linux 运行结果:正确显示

更坑的是 QString::toStdString()。Qt 的 QString 是 UTF-16 内部编码,转成 std::string 默认走 QTextCodec::codecForLocale()。Windows 中文版上它会走 GBK,Linux 上走 UTF-8。同一段代码,同一个文件,两个平台的二进制内容不一样。

统一套路: 显式指定编码,别依赖默认行为。

坑 3:编译器差异——MSVC 和 GCC 不是同一个 C++

// ❌ MSVC 能编译,GCC 报错
struct Config {
int value = 0;       // MSVC 允许类内初始化 + 隐式构造
    QString name;        // MSVC 自动生成移动构造函数
};
std::vector<Config> configs;
configs.reserve(10);     // MSVC 上 push_back 正常
// GCC 上编译错误:没有合适的移动构造函数 / 拷贝构造函数被删除

// ✅ GCC 比 MSVC 严格,显式定义
struct Config {
Config() = default;
Config(const Config&) = default;
Config(Config&&) noexcept = default;
    Config& operator=(const Config&) = default;
    Config& operator=(Config&&) noexcept = default;
int value = 0;
    QString name;
};

GCC 对模板的实例化时机更严格,对 ODR 违反的检测更强。MSVC 宽松,很多"看起来能跑"的代码在 GCC 上直接编译不过。

Aether 中踩得最惨的一次:MSVC 上 std::function 的 target type 能正确匹配,GCC 上返回 nullptr。排查了 3 天,最后发现是跨 DLL 边界传递 std::function 时,GCC 的 RTTI 实现不跨动态库共享 typeinfo。

坑 4:动态库加载——.dll vs .so

Windows 上加载插件:LoadLibrary("plugin_core.dll")。Linux 上:dlopen("libplugin_core.so")

你以为只是后缀名不同?太天真了。

// ❌ Windows 上正常,Linux 上段错误
QLibrary lib("plugin_core");
lib.load();   // Windows 成功,Linux 返回 false
// 原因:Linux 上的 .so 命名是 libplugin_core.so
// QLibrary("plugin_core") 在 Linux 上找的是 plugin_core.so

// ✅ 正确的做法:让 Qt 处理平台差异
QLibrary lib;
#if defined(Q_OS_WIN)
    lib.setFileName("plugin_core");
#elif defined(Q_OS_LINUX)
    lib.setFileName("libplugin_core");
#endif
// 或者更简单——让 QLibrary 自动追加前缀和后缀
lib.setFileName("plugin_core");  // Qt 自动处理

还有更隐蔽的:Linux 上 .so 的符号默认是隐藏的。如果你的插件类要导出给主程序用,必须加 Q_DECL_EXPORT 或写 .def 文件。不然 dlsym 返回 nullptr,插件加载失败,连错误日志都没有。

// Aether 插件导出宏
#if defined(Q_OS_WIN)
#define AETHER_PLUGIN_EXPORT __declspec(dllexport)
#else
#define AETHER_PLUGIN_EXPORT __attribute__((visibility("default")))
#endif

坑 5:信号槽行为差异

Qt 的信号槽机制在 Windows 和 Linux 上行为基本一致。但有一个细节:跨线程的信号槽连接。

// ❌ 在 Linux 上可能触发 assert
Qt::ConnectionType type = Qt::AutoConnection;
// Windows 上:自动判断为 QueuedConnection,正常工作
// Linux 上:某些 GCC 版本中,线程 ID 比较逻辑不一样
// AutoConnection 误判为 DirectConnection,跨线程直接调用
// 导致:对象还在另一个线程上,slot 就执行了——crash

// ✅ 显式指定连接类型
connect(sender, &Sender::signal,
        receiver, &Receiver::slot,
        Qt::QueuedConnection);  // 别偷懒用 Auto

GCC 的 std::thread::id 实现和 MSVC 不一样。MSVC 返回的是整数 ID,GCC 返回的是结构体指针——QThread::currentThreadId() 的底层实现在不同平台上行为不同。保险起见,跨线程通信一律显式指定 Qt::QueuedConnection

坑 6:线程命名

调试时的好习惯:给每个线程起个名字。

// ❌ Windows 上能设置线程名,Linux 上没反应
QThread* worker = new QThread();
worker->setObjectName("WorkerThread");
// Windows 上:VS Debug 窗口显示 "WorkerThread"
// Linux 上:GDB 里看不到这个名字

// ✅ Linux 上要用 pthread_setname_np
void setThreadName(const char* name)
{
#if defined(Q_OS_LINUX)
pthread_setname_np(pthread_self(), name);
#elif defined(Q_OS_WIN)
// Qt 的 setObjectName 在 Windows 上
// 通过 SetThreadDescription 生效
    QThread::currentThread()->setObjectName(name);
#endif
}

不起眼的问题。但在线上排查线程死锁时,一个个 unnamed thread 让你根本分不清谁是谁。

坑 7:文件系统大小写敏感

Windows 上 Config.toml 和 config.toml 是同一个文件。Linux 上是两个不同的文件。

// ❌ 拼写不一致,Windows 上跑得欢
QString path = configDir + "/Config.toml";
// 但是程序里其他地方写的是:
// QString path = configDir + "/config.toml";
// Windows 上正确打开,Linux 上 FileNotFound

// ✅ 统一文件名大小写,保持一致
// 或者在 CMake 阶段就做检查
// 更彻底的方案:写个测试用例遍历所有资源路径

Aether 的教训:配置文件 AppSettings.toml,Windows 上有人写 appsettings.toml,Linux 上 CI 直接挂了。最后定了条死规矩:所有资源路径一律小写 + 下划线。 谁用驼峰谁改。

坑 8:环境变量

GetEnvironmentVariable vs getenv,一个是宽字符,一个是单字节。

// ❌ 手动获取,平台判断乱
QString path;
#ifdef Q_OS_WIN
wchar_t buf[MAX_PATH];
GetEnvironmentVariableW(L"PATH", buf, MAX_PATH);
    path = QString::fromWCharArray(buf);
#else
char* buf = getenv("PATH");
    path = QString::fromUtf8(buf);
#endif

// ✅ Qt 帮你封装了
QString path = qEnvironmentVariable("PATH");
// 跨平台,自动处理编码
// 如果想带默认值:
QString val = qEnvironmentVariable("AETHER_HOME""/opt/aether");

qEnvironmentVariable 在 Qt 5.10 之后引入。如果你还在用老版本,自己封装一个。别裸写平台宏,别重复造轮子。

坑 9:套接字 / IO 模型

Windows 上的 IOCP 和 Linux 上的 epoll 都是异步 IO。但 Qt 的 QTcpSocket 封装了这层差异——前提是你的用法正确。

// ❌ 混合使用阻塞和非阻塞,Windows 上正常
QTcpSocket socket;
socket.connectToHost("127.0.0.1"8080);
socket.waitForConnected(3000);   // 阻塞等连接
socket.write(data);
socket.waitForBytesWritten(3000); // 阻塞等写入

// Linux 上:waitForBytesWritten 可能直接返回 false
// 原因:epoll 模式下,非阻塞 socket 的写入行为不同
// 内核缓冲区大小不一样,EAGAIN 的处理方式不同

// ✅ 统一用事件驱动,别混用
QTcpSocket socket;
connect(&socket, &QTcpSocket::connected, [&]() {
    socket.write(data);
});
connect(&socket, &QTcpSocket::bytesWritten, [&](qint64 bytes) {
// 写入完成回调
});
socket.connectToHost("127.0.0.1"8080);

核心原则:写了事件循环就别再用 waitFor 系列函数。 Windows 上它可能碰巧能用,Linux 上 epoll 的行为让你死得明明白白。

坑 10:打包部署

最后一个坑,也是最容易被忽视的。

Windows 上 windeployqt 一把梭,把需要的 DLL 全拷过来。Linux 上 ldd 一看,缺这个缺那个。

# ❌ 以为 Qt 的 so 会自动被找到
./aether
# error while loading shared libraries: libQt5Core.so.5

# ✅ 正确做法:设置 rpath 或用 AppImage
# 方案 A:CMake 里设 rpath
set_target_properties(aether PROPERTIES
    INSTALL_RPATH "$ORIGIN/../lib"
    BUILD_RPATH "$ORIGIN/../lib"
)

# 方案 B:用 linuxdeployqt 打 AppImage
# linuxdeployqt aether -appimage

# 方案 C:写个 wrapper 脚本
#!/bin/bash
DIR="$(cd "$(dirname "$0")" && pwd)"
export LD_LIBRARY_PATH="$DIR/../lib:$LD_LIBRARY_PATH"
exec "$DIR/aether" "$@"

更坑的是 Qt 插件的 so 文件:platforms/libqxcb.so 必须在 platforms/ 目录下,且必须能被找到。不然 Qt 启动时直接弹 "Cannot load platform plugin" 就没下文了。

在 Linux 上,一切都要你自己摆好。 没有 Windows 那种"DLL 放旁边就能找到"的好事。


三、Aether 的跨平台策略

踩完这些坑之后,我们总结了一套打法。

CMake 层面:一次配置,两边编译

# 跨平台编译选项
if(WIN32)
    target_compile_definitions(aether PRIVATE AETHER_OS_WIN)
    set(PLATFORM_SOURCES
        src/platform/win/win_utils.cpp
        src/platform/win/registry.cpp
    )
elseif(UNIX AND NOT APPLE)
    target_compile_definitions(aether PRIVATE AETHER_OS_LINUX)
    set(PLATFORM_SOURCES
        src/platform/linux/linux_utils.cpp
        src/platform/linux/dbus.cpp
    )
endif()

# 统一 UTF-8 源码编码
if(MSVC)
    target_compile_options(aether PRIVATE /utf-8)
endif()

# 设置 rpath,方便部署
set_target_properties(aether PROPERTIES
    INSTALL_RPATH "$ORIGIN/../lib"
    BUILD_RPATH "$ORIGIN/../lib"
)

CMake 是跨平台的基石。所有平台差异在 CMake 层面解决,代码层面尽量少用 #ifdef

代码层面:隔离平台差异

// 封装平台函数,不让平台宏污染业务代码
namespace Aether::Platform {

QString defaultConfigPath()
{
#if defined(Q_OS_WIN)
return QStandardPaths::writableLocation(
        QStandardPaths::AppDataLocation);
#elif defined(Q_OS_LINUX)
return QDir::homePath() + "/.config/aether";
#else
return QCoreApplication::applicationDirPath() + "/config";
#endif
}

// namespace Aether::Platform

平台差异用独立的命名空间和文件隔离,业务代码只调用抽象接口。不写 #ifdef 在业务逻辑中间。

CI/CD 层面:双平台自动化测试

Aether 的 CI 流水线:Windows 上 MSVC 编译一次,Linux 上 GCC 编译一次。两边跑同样的 200+ 测试用例。

Windows CI —— MSVC x64 —— 编译 + 单元测试 + 集成测试
Linux CI ——— GCC x64 —— 编译 + 单元测试 + 集成测试 + 压力测试

一条铁律: 如果改动涉及文件 IO、网络、进程、编码,必须在两个平台上都跑通。只在一个平台过的 PR 不让合。


四、Qt 的跨平台优势——但别信"一套代码跑所有"

Qt 的跨平台能力是真实的。一套源码,Windows 上用 MSVC 编译,Linux 上用 GCC 编译,macOS 上用 Clang 编译——大部分代码不需要改。

但这不代表你可以不关心平台差异。Qt 帮你处理的是:

  • 窗口系统(Win32 → X11/Wayland)
  • 事件循环(Windows message → epoll/select)
  • 线程 API(Win32 threads → pthreads)
  • 文件 IO(CreateFile → open)
  • 网络(Winsock → POSIX socket)

Qt 没帮你处理的是:

  • 编译器差异(MSVC vs GCC vs Clang)
  • 编码默认值(GBK vs UTF-8)
  • 动态库加载行为(DLL search path vs ldconfig)
  • 文件系统语义(大小写敏感、权限模型)
  • 部署方式(安装包 vs AppImage vs 源码编译)
  • 信号/槽的跨线程行为

Qt 是跨平台框架,不是万能橡皮擦。 它抹平了操作系统的差异,但抹不平编译器和生态的差异。


五、写在最后

跨平台适配这件事,说难不难——每个坑单拎出来都能修。

但问题是它不会一次全出来。今天修了路径分隔符,下周才发现编码也有问题。等编码修好了,线程名在 GDB 里看不见。等你都修完了,Linux 客户说 kernel 版本太新,GLIBC 版本不兼容。

Aether 最终的解决方案其实就一句话:

别在 Windows 上默认 Linux 的行为跟它一样。也别在 Linux 上抱怨它跟 Windows 不一样。

每个平台有每个平台的脾气。CMake 管编译,Qt 管跨平台 API,CI/CD 管验证,开发者管意识。四样缺一个,你迟早要在周五晚上 5 点面对一个段错误。


💬 评论区聊聊:

你的项目跨平台时遇到过什么奇葩问题?是文件路径那种"低级但致命"的坑,还是编译器差异这种"查了 3 天才找到原因"的魔幻 bug?评论区说说你的血泪史。

🔄 觉得有用?

如果你身边有同事正在把 Windows 项目往 Linux 上迁移,转发给他——这篇能让他少熬 3 个通宵。

⭐ 觉得不错?点个"在看"让更多人看到,也让我有动力继续写。


下一篇(终篇):

从 C++ 入门到工业级项目,完整的成长路线。

21 篇文章了。从项目架构到插件系统,从 MVVM 到跨平台适配,你跟着 Aether 把一个大项目的方方面面都过了一遍。

最后一篇,我们来聊聊另一件事——你不是不会 C++,你是不知道这条路怎么走。下篇,把整条成长路线画给你看。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-29 14:15:44 HTTP/2.0 GET : https://f.mffb.com.cn/a/512329.html
  2. 运行时间 : 0.201326s [ 吞吐率:4.97req/s ] 内存消耗:4,574.62kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=f269c077fe03b0347f97f3ca448b6bf8
  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.000959s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001534s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000727s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000699s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001410s ]
  6. SELECT * FROM `set` [ RunTime:0.000621s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001600s ]
  8. SELECT * FROM `article` WHERE `id` = 512329 LIMIT 1 [ RunTime:0.002043s ]
  9. UPDATE `article` SET `lasttime` = 1787984144 WHERE `id` = 512329 [ RunTime:0.021999s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000678s ]
  11. SELECT * FROM `article` WHERE `id` < 512329 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001225s ]
  12. SELECT * FROM `article` WHERE `id` > 512329 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001022s ]
  13. SELECT * FROM `article` WHERE `id` < 512329 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002904s ]
  14. SELECT * FROM `article` WHERE `id` < 512329 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001771s ]
  15. SELECT * FROM `article` WHERE `id` < 512329 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001816s ]
0.205038s