当前位置:首页>Linux>嵌入式 Linux 调 闭源 SDK 怕崩?用 dlopen 把第三方动态库"隔离"起来

嵌入式 Linux 调 闭源 SDK 怕崩?用 dlopen 把第三方动态库"隔离"起来

  • 2026-08-18 23:10:39
嵌入式 Linux 调 闭源 SDK 怕崩?用 dlopen 把第三方动态库"隔离"起来

1. 第三方闭源 SDK 的痛,谁接谁知道

做嵌入式 Linux 开发的兄弟,应该都遇到过这种场景:产品要加一个新功能,比如接一个身份认证模块,供应商发来一份 闭源的动态库(.so)+ 一堆头文件,只给几个函数原型和一份 PDF 文档,源码一个字也看不到。

这类 SDK 往往有几个让人头大的特点:

  • 库是我们自己编不出来的,版本节奏完全被供应商卡着;
  • 不同硬件批次、不同地区,可能要求换不同版本的 .so;
  • 万一供应商的库有 bug 或者根本没部署进去,最怕的就是——主程序起不来

本文就以"身份证阅读器 SDK"为例,而且只聚焦它最常用、最核心的一件事:读取身份证卡片信息(文字 + 照片)。我们不谈清零、不谈配置、不谈其它花哨能力,就把"读卡"这一个动作,用运行时动态加载的方式,稳稳当当地接进嵌入式应用里。

2. 链接期加载 vs 运行时 dlopen:本质区别在哪

很多工程师一听"动态库",就以为"用了 .so 就是动态加载"。这是一个非常普遍的误解。我们用一张对比表把事儿说清楚:

维度
链接期动态链接(load-time linking)
运行时动态加载(run-time linking)
典型做法
编译时 -lxxcard,连接器记录 NEEDED
代码里 dlopen("/path/xxcard.so")
库缺失的后果
进程启动即失败
(loader 报 cannot open shared object file
仅加载失败,主程序照常运行
谁来决定加载
动态链接器(ld.so),启动时
代码,运行时任意时刻
符号解析时机
启动 / 首次调用时
dlsym
 显式解析
故障隔离
无,一损俱损
有,可 try-catch 式处理

关键点来了:即便用的是 .so,只要是 -lxxx 链接的,那它本质上还是"链接期加载"。动态链接器在进程 exec 一开始就会去解析所有 NEEDED 库,只要有一个 .so 不在、或版本不对,整个进程直接起不来,连 main() 都进不去。

而 dlopen 是真·运行时加载:库找不到了?返回 NULL, printf 一句告警,程序继续跑,顶多少一个读卡功能。这就是"故障隔离"的价值——把第三方的不确定性关在沙箱里,别让它拖垮主程序

这也是为什么嵌入式现场部署,尤其是那种"库可能随时被替换、可能根本没烧进去"的盒子类产品,我强烈建议用 dlopen

3. 【实战方案】用 dlopen 做真正的运行时加载

下面这套写法是我这些年沉淀下来的通用实战模板,不是某项目的代码,可以直接搬到任何"接闭源 .so"的场景里。

3.1 函数指针表封装:调用方无感知

核心思想:把 SDK 暴露的几个函数,收进一个结构体(函数指针表)。上层业务只认这个结构体,根本不知道背后是 dlopen 还是静态链接。

/* id_reader_api.h —— 通用函数指针表定义 */#ifndef ID_READER_API_H#define ID_READER_API_H#include <stdint.h>#include <stddef.h>/* 身份证文字信息(简化示例结构体) */typedef struct {char name[32];        /* 姓名 */char id_number[19];   /* 身份证号 */char address[64];     /* 住址 */id_card_info_t;/* 读卡结果回调得到的照片(JPEG 数据 + 长度) */typedef struct {uint8_t *jpg_buf;     /* 照片数据缓冲区,由 SDK 分配 */size_t   jpg_len;     /* 数据长度 */id_card_photo_t;/* 函数指针表:把 SDK 对外能力收拢到这里 */typedef struct {/* 打开设备,返回 >=0 的句柄,<0 表示失败 */int  (*open)(void);/* 关闭设备 */void (*close)(int handle);/* 读取卡文字信息,成功返回 0 */int  (*read_info)(int handle, id_card_info_t *info);/* 读取卡照片,成功返回 0,photo.jpg_buf 需调用方释放 */int  (*read_photo)(int handle, id_card_photo_t *photo);id_reader_api_t;#endif /* ID_READER_API_H */

3.2 dlopen + dlsym:立即解析、宏统一填充、失败即回滚

下面是实现。注意几个实战细节:

  • RTLD_NOW:加载时立即解析所有符号,宁可加载时就报错,也不要等到调函数时才崩;
  • RTLD_LOCAL:符号不注入全局符号表,避免污染其它模块、避免同名符号冲突;
  • 用宏统一 dlsym 填充,失败时 dlclose 回滚 + 返回失败,绝不留半成品句柄。
/* id_reader_loader.c —— 运行时加载身份证阅读器 SDK(通用写法) */#include "id_reader_api.h"#include <dlfcn.h>#include <stdio.h>#include <stdlib.h>#include <string.h>/* 用宏统一填充函数指针:失败时打印并跳转到回滚 */#define LOAD_SYM(handle, sym_ptr, sym_name)                            \    do {                                                               \        *(void **)(&(sym_ptr)) = dlsym((handle), (sym_name));          \if ((sym_ptr) == NULL) {                                       \            fprintf(stderr, "dlsym 失败 [%s]: %s\n",                    \                    (sym_name), dlerror());                            \            goto rollback;                                             \        }                                                              \    } while (0)static id_reader_api_t g_api;   /* 全局函数指针表,调用方通过接口取用 */static void *g_lib_handle = NULL;int id_reader_load(const char *so_path){/* 清空旧的错误状态(dlerror 线程局部,先清一次) */    dlerror();/* 立即解析 + 局部符号,隔离第三方库的符号污染 */    g_lib_handle = dlopen(so_path, RTLD_NOW | RTLD_LOCAL);if (g_lib_handle == NULL) {/* 注意:dlopen 失败时 dlerror() 返回错误信息,且仅可安全获取一次 */fprintf(stderr"dlopen 失败 [%s]: %s\n", so_path, dlerror());return -1;    }/* 逐个填充函数指针,任意一项失败即整体回滚 */    LOAD_SYM(g_lib_handle, g_api.open,      "id_open");    LOAD_SYM(g_lib_handle, g_api.close,     "id_close");    LOAD_SYM(g_lib_handle, g_api.read_info, "id_read_info");    LOAD_SYM(g_lib_handle, g_api.read_photo,"id_read_photo");return 0;rollback:if (g_lib_handle != NULL) {        dlclose(g_lib_handle);   /* 失败回滚:绝不留下半初始化句柄 */        g_lib_handle = NULL;    }memset(&g_api, 0sizeof(g_api));return -1;}void id_reader_unload(void){if (g_lib_handle != NULL) {        dlclose(g_lib_handle);        g_lib_handle = NULL;    }memset(&g_api, 0sizeof(g_api));}const id_reader_api_t *id_reader_get_api(void){return (g_lib_handle != NULL) ? &g_api : NULL;}

3.3 dlerror() 只可获取一次的坑

这是新手必踩的:dlerror() 的语义是**"取出并返回最近一次错误,然后清空错误状态"**。所以:

  • 调 dlopen 失败后,要第一时间 dlerror() 把字符串拷出来或打印,别隔着好几行再取,否则可能取到 NULL(被后续不相干调用清空);
  • 我们代码里在 dlopen 前先调一次 dlerror() 清状态,是个好习惯,避免拿到上一次的历史错误。

3.4 读卡调用示意(调用方完全无感知)

/* 业务侧调用示例:完全不知道底层是 dlopen 还是静态链接 */void demo_read_card(void){const id_reader_api_t *api = id_reader_get_api();if (api == NULL) {printf("身份证模块未加载,跳过读卡功能\n");return;   /* 主程序照常运行,只是少了读卡 */    }int h = api->open();if (h < 0) {printf("打开读卡设备失败\n");return;    }id_card_info_t info;memset(&info, 0sizeof(info));if (api->read_info(h, &info) == 0) {printf("姓名:%s 证件号:%s\n", info.name, info.id_number);    }id_card_photo_t photo;memset(&photo, 0sizeof(photo));if (api->read_photo(h, &photo) == 0) {printf("照片长度:%zu 字节\n", photo.jpg_len);free(photo.jpg_buf);   /* 按 SDK 约定释放 */    }    api->close(h);}

4. 部署:.so 放 $ORIGIN/Libs + RPATH,以及 C++ SDK 的链接坑

4.1 不依赖 LD_LIBRARY_PATH:RPATH = $ORIGIN/Libs

现场部署最怕让实施人员去改 LD_LIBRARY_PATH——改漏了、改串了,必出问题。更好的做法是:

  • 把身份证 SDK 的 .so 放在可执行文件同级的 Libs/ 目录
  • 链接主程序时加:
-Wl,-rpath,'$ORIGIN/Libs'

$ORIGIN 是动态链接器(ld.so)认识的占位符,表示可执行文件自身所在目录。这样无论程序被放到 /usr/bin 还是 /opt/app,它都会去 自己的目录/Libs 下找库,完全不依赖环境变量,部署最稳。

注意:如果走的是 dlopen 显式指定路径(如 "./Libs/xxcard.so"),那 RPATH 其实帮不上 dlopen 的忙,得在代码里拼好路径。RPATH 主要惠及链接期 NEEDED 的库SDK 内部依赖的二级 .so

4.2 C++ 实现 SDK 的链接天坑:--allow-shlib-undefined

很多身份证 SDK 是 C++ 实现、但只暴露 C 接口(用 extern "C" 包一层)。拿它链接主程序(主程序可能是 C 或 C++)时,可能会看到这种报错:

undefined reference to 'vtable for std::logic_error'undefined reference to '__cxa_pure_virtual'undefined reference to '_ZNKSt8__cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv'... GLIBCXX_3.4.21 not found ...

根因:这个 .so 内部用到了 C++ 运行时(libstdc++.so.6),这些符号本应在运行时由 .so 自己 NEEDED 的 libstdc++.so.6 去解析。但链接主程序时,链接器默认会去"顺手解析"这些从 .so 里冒出来的未定义符号,又找不到,于是报错。

解法:链接主程序时放行:

-Wl,--allow-shlib-undefined

告诉链接器:".so 里的未定义符号别管,运行时它自己解决"。

更彻底的两种思路

  1. 改用 dlopen:这个问题自动消失——因为根本不链接这个 .so,链接器碰不到它的符号;
  2. 即便用了 dlopen,也别忘了:.so 自己依赖的 libstdc++.so.6 必须部署到位。嵌入式板子的根文件系统里 libstdc++.so.6 版本太老,照样会报 GLIBCXX_xxx not found。这条和链接方式无关,是运行时依赖,得单独核对。

实战提示:用 readelf -d xxx.so | grep NEEDED 一眼看清这个库到底依赖哪些运行时库,部署清单就照这个来,别靠猜。

7. 总结

  • 别把"用了 .so"等同于"动态加载"-lxxx 是链接期加载,库缺失进程直接起不来;dlopen 才是真运行时,能故障隔离。
  • dlopen 用 RTLD_NOW | RTLD_LOCAL:立即解析早暴露问题,局部符号避免污染。
  • 函数指针表封装:上层业务零感知,将来换 SDK、换静态链接都不用改业务代码。
  • dlsym 失败即 dlclose 回滚:绝不留半初始化句柄,用宏统一填充更清爽。
  • dlerror() 取完即失效:失败第一时间打印/拷贝,别隔行再取。
  • 部署用 -Wl,-rpath,'$ORIGIN/Libs':摆脱 LD_LIBRARY_PATH 依赖,现场最稳。
  • C++ 实现的 SDK:链接期报 vtable/__cxa_* 就加 --allow-shlib-undefined;用 dlopen 则天然规避,但 libstdc++.so.6 运行时版本必须匹配。
如果觉得不错,欢迎 点赞、收藏、转发 ,如果想第一时间收到推送,也可以给个星标⭐~~

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-21 22:52:11 HTTP/2.0 GET : https://f.mffb.com.cn/a/505298.html
  2. 运行时间 : 0.185888s [ 吞吐率:5.38req/s ] 内存消耗:4,687.69kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0d00b5c780cd358dedc91451114fc4d8
  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.001093s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001460s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002533s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000987s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001335s ]
  6. SELECT * FROM `set` [ RunTime:0.000546s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001535s ]
  8. SELECT * FROM `article` WHERE `id` = 505298 LIMIT 1 [ RunTime:0.001094s ]
  9. UPDATE `article` SET `lasttime` = 1787323931 WHERE `id` = 505298 [ RunTime:0.003096s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.000651s ]
  11. SELECT * FROM `article` WHERE `id` < 505298 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001102s ]
  12. SELECT * FROM `article` WHERE `id` > 505298 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001032s ]
  13. SELECT * FROM `article` WHERE `id` < 505298 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001589s ]
  14. SELECT * FROM `article` WHERE `id` < 505298 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.002244s ]
  15. SELECT * FROM `article` WHERE `id` < 505298 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004332s ]
0.189647s