当前位置:首页>鸿蒙APP>Electron鸿蒙PC上恢复窗口状态,多显示器拔插后我的窗口飞不见了

Electron鸿蒙PC上恢复窗口状态,多显示器拔插后我的窗口飞不见了

  • 2026-07-07 01:38:08
Electron鸿蒙PC上恢复窗口状态,多显示器拔插后我的窗口飞不见了

Electron鸿蒙PC上恢复窗口状态,多显示器拔插后我的窗口飞不见了

上周用户提了个需求:希望应用重启后能记住上次关闭时的窗口大小和位置。听起来 trivial 对吧?我在 Mac 和 Windows 上做过不下十次,闭着眼睛都能写。结果在鸿蒙 PC 上搞了整整两个晚上,窗口不是飞到屏幕外面,就是缩成了指甲盖大小。下面把趟过的坑全记下来。

第一坑:screen.getAllDisplays() 返回的数据不能信

Electron 的 screen 模块大家都熟,拿到所有显示器信息然后算坐标,常规操作:

const { screen } = require('electron');function getBestDisplay(winBounds) {  const displays = screen.getAllDisplays();  // 找包含窗口中心点的显示器  const center = {    x: winBounds.x + winBounds.width / 2,    y: winBounds.y + winBounds.height / 2  };  return displays.find(d => {    const b = d.bounds;    return center.x >= b.x && center.x <= b.x + b.width &&           center.y >= b.y && center.y <= b.y + b.height;  }) || displays[0];}

这段代码在 Windows 上稳如老狗,在鸿蒙 PC 上直接翻车。我发现 getAllDisplays() 返回的 bounds 和 workArea 有时候是空的,有时候宽高超离谱——比如一个 1920×1080 的屏幕,bounds 竟然返回 { x: 0, y: 0, width: 3840, height: 2160 },正好是实际分辨率的两倍。我一开始以为是高分屏缩放的问题,查了两天才发现,鸿蒙 PC 的显示服务在某些场景下会把物理像素和逻辑像素混着返回,而且不带 scaleFactor 修正。

更离谱的是,如果你外接了一台显示器,然后拔掉,再调用 getAllDisplays(),它有时候还会返回那台已经不存在的显示器,持续好几秒。我猜测是鸿蒙的显示子系统缓存没及时刷新。

兜底方案:别全信 screen API,恢复窗口状态前必须做合法性校验:

function sanitizeBounds(saved, displays) {  const MIN_VISIBLE = 100// 至少露 100px 在屏幕里  const MAX_W = 3840MAX_H = 2160;  // 过滤异常值  let { x, y, width, height } = saved;  width = Math.min(Math.max(width, 400), MAX_W);  height = Math.min(Math.max(height, 300), MAX_H);  // 检查是否至少有一部分落在有效显示器内  const visible = displays.some(d => {    const b = d.workArea || d.bounds;    const intersectX = Math.max(0Math.min(x + width, b.x + b.width) - Math.max(x, b.x));    const intersectY = Math.max(0Math.min(y + height, b.y + b.height) - Math.max(y, b.y));    return intersectX >= MIN_VISIBLE && intersectY >= MIN_VISIBLE;  });  if (!visible) {    // 回退到主显示器中央    const primary = displays.find(d => d.id === screen.getPrimaryDisplay().id)                    || displays[0];    const b = primary.workArea || primary.bounds;    x = b.x + (b.width - width) / 2;    y = b.y + (b.height - height) / 2;  }  return { xMath.round(x), yMath.round(y), width, height };}

这段代码我现在每个 Electron 项目都复制一份,已经成了标配。

第二坑:maximized 状态在鸿蒙上是个伪命题

Electron 的 BrowserWindow 有 isMaximized() 方法,保存状态时通常这么写:

const state = {  width: win.getSize()[0],  height: win.getSize()[1],  x: win.getPosition()[0],  y: win.getPosition()[1],  maximized: win.isMaximized()};

恢复时如果 maximized 为 true,就先 win.show() 再 win.maximize()。这在其他平台没问题,在鸿蒙 PC 上我发现了两个怪事。

怪事一:如果窗口在关闭前是最大化状态,下次启动时调用 maximize(),窗口有时候会卡在全屏和正常尺寸之间——标题栏消失了,但内容区域又没有真正铺满屏幕。看起来像鸿蒙的窗口管理器和 Electron 的 Chromium 框架在边框计算上产生了分歧。我试了 setTimeout(() => win.maximize(), 100) 都不行,最后发现必须先等 ready-to-show 事件触发后,再延迟一帧:

win.once('ready-to-show'() => {  if (savedState.maximized) {    // 鸿蒙 PC 需要多一帧让窗口管理器就绪    setImmediate(() => win.maximize());  }  win.show();});

setImmediate 比 setTimeout(..., 0) 更早执行,刚好卡在 Chromium 渲染进程和鸿蒙窗口服务之间那个微妙的时机。

怪事二:如果用户上次是在扩展屏上最大化的,然后拔掉扩展屏重启应用,直接 maximize() 会导致窗口尺寸变成扩展屏的分辨率,但显示在主屏上,底部直接溢出任务栏。我的做法是:最大化前永远先校验当前显示器尺寸,如果和保存时不一致,就放弃最大化状态,改为手动计算一个合理的居中尺寸。

说实话,isMaximized() 这个 API 在鸿蒙上不太靠谱。我现在改成双保险:既存 maximized 标志位,也存正常化后的 normalBounds,恢复时根据显示器环境决定走 maximize 还是手动铺满。

// 保存时const state = win.isMaximized()  ? { maximizedtruenormalBounds: win.getNormalBounds() }  : { maximizedfalsebounds: win.getBounds() };// 恢复时if (state.maximized) {  win.setBounds(state.normalBounds); // 先放到合理位置  setImmediate(() => win.maximize());}

第三坑:DPI 变化后窗口变成显微镜

鸿蒙 PC 的显示器 DPI 切换策略和 Windows 不太一样。我在一台 2K 屏(缩放 150%)上运行应用,窗口尺寸设为 1200×800,一切正常。然后把窗口拖到一台 1080p 普通屏上关闭,下次在这台 1080p 屏上打开,窗口直接变成了 1800×1200——因为 Electron 把之前那套逻辑像素当成物理像素用了。

根本原因是 Electron 在鸿蒙上获取 display.scaleFactor 的时机有问题。窗口创建时如果还没有正确关联到目标显示器,webPreferences 里的 devicePixelRatio 就可能是错的。我查了很久,没找到在创建窗口前强制指定 DPI 的方法。

我的 workaround 很粗暴但有效:恢复窗口后,立刻根据当前显示器的实际 DPI 重新矫正一次尺寸。

function correctDpiMismatch(win) {  const display = screen.getDisplayMatching(win.getBounds());  const scale = display.scaleFactor || 1;  if (scale !== 1) {    const [w, h] = win.getSize();    // 如果保存的尺寸明显大于显示器工作区,按 DPI 反推    const work = display.workArea;    if (w > work.width || h > work.height) {      win.setSize(Math.round(w / scale), Math.round(h / scale));    }  }}

这法子不优雅,但确实把问题按住了。我怀疑是 Chromium 在 OpenHarmony 显示后端上的某个 bug,等官方修估计得半年。

第四坑:多显示器拔插后,窗口坐标变成负数的鬼故事

最诡异的一次,用户反馈说他笔记本外接了一个显示器,把应用拖到扩展屏右上角,关闭。第二天到公司没接显示器,打开应用——窗口没了。任务栏上有图标,Alt+Tab 也看得到,但屏幕上没有任何东西。

我远程一看,窗口坐标变成了 x: 3120, y: -20。他笔记本屏幕只有 1920×1080,窗口飞到了完全不存在的坐标上。更糟的是,鸿蒙 PC 上 win.center() 有时候也不管用,如果窗口的 x 是负数或者超出范围,center() 计算出来的新坐标还是错的。

这问题的根源是:鸿蒙桌面在显示器热插拔时,不会自动把游离窗口拉回可见区域。Windows 和 macOS 都有这个保护机制,鸿蒙目前(至少我测的 5.0.1 版本)没有。

我的解决方案是在应用启动和显示器变化两个时机都做矫正:

function rescueOffscreenWindow(win) {  const bounds = win.getBounds();  const displays = screen.getAllDisplays();  const valid = sanitizeBounds(bounds, displays);  if (valid.x !== bounds.x || valid.y !== bounds.y) {    // 如果修正了位置,先取消最大化状态再移动    if (win.isMaximized()) win.unmaximize();    win.setPosition(valid.x, valid.y);  }}// 启动时app.whenReady().then(() => {  const win = createWindow();  rescueOffscreenWindow(win);});// 显示器配置变化时screen.on('display-added'() => rescueOffscreenWindow(win));screen.on('display-removed'() => setTimeout(() => rescueOffscreenWindow(win), 500));

注意 display-removed 我用了 setTimeout(..., 500),因为前面提过,鸿蒙的显示子系统缓存刷新有延迟,立刻矫正可能还是用的旧显示器数据。

第五坑:JSON 文件保存路径在应用更新后变了

这个坑跟窗口状态本身无关,但直接影响功能。我把窗口状态存在 app.getPath('userData') 下的 window-state.json 里。鸿蒙 PC 上 Electron 应用的 userData 路径大概是 /data/app/el2/100/base/{bundleName}/database/{appName}。问题出在应用更新后,鸿蒙有时候会分配一个新的沙箱路径,老路径下的配置文件直接作废,窗口状态全部重置。

更坑的是,app.getPath('userData') 在更新前后返回的路径确实不一样。我不是鸿蒙系统专家,猜测和它的分布式应用管理策略有关。反正用户视角就是:更新了个版本,窗口又变回默认大小了。

最终我把配置文件移到了鸿蒙提供的 filesDir 下,通过 os.homedir() 拼接一个相对固定的路径:

const path = require('path');const os = require('os');function getStableConfigPath() {  // 鸿蒙 PC 上优先用 home 下的固定目录,避免应用更新导致路径漂移  const home = os.homedir();  return path.join(home, '.config''my-electron-app''window-state.json');}

当然,这样脱离了鸿蒙推荐的沙箱目录,理论上不太合规。但至少功能稳了,后面再研究怎么在沙箱内做配置迁移。

完整封装

把上面这些兜底逻辑打包成一个 WindowStateManager,项目中直接复用:

// window-state-manager.jsconst { screen, BrowserWindow } = require('electron');const fs = require('fs');const path = require('path');class WindowStateManager {  constructor(options = {}) {    this.file = options.path || this._defaultPath();    this.state = this._read();    this.win = null;  }  _defaultPath() {    const os = require('os');    return path.join(os.homedir(), '.config''my-app''window-state.json');  }  _read() {    try {      return JSON.parse(fs.readFileSync(this.file, 'utf8'));    } catch {      return { width: 1200, height: 800, maximized: false };    }  }  _write() {    const dir = path.dirname(this.file);    if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });    fs.writeFileSync(this.file, JSON.stringify(this.state, null2));  }  apply(win) {    this.win = win;    const displays = screen.getAllDisplays();    const bounds = sanitizeBounds(this.state, displays);    win.setBounds(bounds);    if (this.state.maximized) {      setImmediate(() => win.maximize());    }    // 监听变化    const save = () => {      this.state = {        ...win.getNormalBounds(),        maximized: win.isMaximized()      };      this._write();    };    win.on('resize', save);    win.on('move', save);    win.on('closed', save);    // 显示器变化时救援    screen.on('display-removed', () => {      setTimeout(() => rescueOffscreenWindow(win), 500);    });  }}module.exports = { WindowStateManager };

主进程里三行代码搞定:

const { WindowStateManager } = require('./window-state-manager');const stateManager new WindowStateManager();const win new BrowserWindow({ width1200, height800, showfalse });stateManager.apply(win);

写在最后

说实话,窗口状态保存这个需求,我之前从来没把它当回事。Windows 上 electron-window-state 一把梭,Mac 上系统自己帮你管得好好的。鸿蒙 PC 作为新平台,很多细节确实还没打磨到位,尤其是多显示器和 DPI 这一块。现在我的每个鸿蒙项目都会把这个 WindowStateManager 塞进去,宁可过度设计也不想再被用户骂"窗口又不见了"。

如果你也在做 Electron 鸿蒙桌面应用,建议尽早把窗口状态管理加上,而且要带够兜底。别像我一样,等用户报 bug 了再连夜填坑。


本文代码遵循 MIT 协议。转载请注明出处,商业用途请联系作者获取授权。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-17 14:31:47 HTTP/2.0 GET : https://c.mffb.com.cn/a/490870.html
  2. 运行时间 : 0.234814s [ 吞吐率:4.26req/s ] 内存消耗:4,363.33kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=65c361386caa4fe74dd322c01be520e5
  1. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/runtime/temp/cefbf809ba1a84190cb04b0cb7abcf79.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/c.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000391s ] mysql:host=127.0.0.1;port=3306;dbname=c_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000526s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.023224s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000326s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000607s ]
  6. SELECT * FROM `set` [ RunTime:0.000291s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000628s ]
  8. SELECT * FROM `article` WHERE `id` = 490870 LIMIT 1 [ RunTime:0.000465s ]
  9. UPDATE `article` SET `lasttime` = 1784269907 WHERE `id` = 490870 [ RunTime:0.012129s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000317s ]
  11. SELECT * FROM `article` WHERE `id` < 490870 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000496s ]
  12. SELECT * FROM `article` WHERE `id` > 490870 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.007313s ]
  13. SELECT * FROM `article` WHERE `id` < 490870 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002655s ]
  14. SELECT * FROM `article` WHERE `id` < 490870 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.081256s ]
  15. SELECT * FROM `article` WHERE `id` < 490870 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.035603s ]
0.236284s