乐于分享
好东西不私藏

把 Office 预览完整搬进浏览器:一次仍在继续的纯前端长跑

把 Office 预览完整搬进浏览器:一次仍在继续的纯前端长跑

把 Office 预览完整搬进浏览器:一次仍在继续的纯前端长跑

你是不是也遇到过这样的场景:

用户上传了一个 .doc.ppt.docx 或 .pptx,产品经理希望“页面里直接预览一下”;安全同学又补一句:“文件最好别出浏览器”;部署同学继续补刀:“能不能别再加一套 LibreOffice 转换服务?”

这时,前端同学通常会沉默几秒。

因为 Office 预览这件事,看起来像一个按钮,背后却是一整条很长的路:容器、编码、样式、图片、矢量图、版式、分页、母版、占位符、历史二进制格式,还有各种真实文件里不太讲道理的边角。

Excel还好,因为有大名鼎鼎的Sheetjs。

而这篇文章想聊的,就是这条路上的一次持续尝试:让浏览器自己解析并渲染 DOC、DOCX、PPT、PPTX。

它还在继续打磨,离覆盖整个 Office 世界还有距离。可阶段性跑通以后,我们已经能看到一个很实在的方向:在很多预览场景里,Office 文件可以不先绕到服务端转换链路,浏览器也能承担起一部分“读懂文档”的工作。

这个痛点,很多团队都熟

你是不是为了文档预览接过一套转换服务?

文件上传,服务端排队,转 PDF,前端展示。流程成熟,效果也不错。但它会带来一串工程问题:

  • 私有化环境里,要多部署一套 Office 转换组件;
  • 内网、离线、审计场景里,文件流转路径变长;
  • 转成 PDF 后,原始结构、批注、书签、对象信息很容易被压平;
  • 对浏览器插件、知识库、低代码平台、小型工作台来说,这条链路有点重。

成熟方案当然有价值。Office Online、LibreOffice、OnlyOffice、Collabora 这些路线都解决了大量生产问题。我们这次做纯前端预览,想多给应用一条选择:

帮你解决“只想安全、轻量地看一眼文档”的痛点。

如果文件本来就在浏览器里,如果业务只需要预览、检索、结构化诊断、局部还原,那么纯前端解析渲染就有了意义。

四个项目,四种格式,四条硬路

这套工程拆成了四个项目,每个项目专注一个方向:

项目
格式
主要工作
msdoc-viewer.doc
CFB、FIB、CLX、OfficeArt、二进制 Word AST、HTML 渲染
@wybaby168/docx-viewer.docx
ZIP、OPC、WordprocessingML、样式级联、动态分页
ppt-viewer.ppt
CFB、Persist Map、slide/master/notes、OfficeArt、Metro blob
pptx-viewer.pptx
OPC relationships、PresentationML、theme、master-layout-slide 继承

再由 office-render-demo 把它们按需加载起来,用真实样例做端到端检查。

先说一句实话:这事不轻松。

.docx.pptx 至少还是 ZIP + XML,虽然复杂,但你能看到标签。.doc.ppt 这种二进制格式就更像翻旧账:你得先打开 CFB 复合文件,再顺着一堆偏移、表、记录头、流名,把正文、图片、样式、母版一点点捞回来。

微软公开了相关规范,比如 [MS-DOC]、[MS-PPT]、[MS-CFB]。规范很重要,也很厚。真正落到浏览器实现时,难点往往在这些地方:

  • 实际文件会带着历史软件留下的非标准结构;
  • 二进制流里很多数据需要通过偏移和表交叉定位;
  • 图片可能藏在 OfficeArt 容器、延迟 BLIP、对象池或 Data stream 里;
  • 浏览器没有 Word / PowerPoint 的原生排版引擎;
  • 预览要能降级,还要能告诉开发者哪里没还原出来。

总体思路:先做可信模型,再谈渲染

一开始如果直接拼 HTML,很快就会被格式细节拖住。更稳的方式是先把文件拆成中间模型:哪些是段落,哪些是表格,哪些是图片,哪些是浮动对象,哪些来自母版,哪些只能 fallback。

下面这张图是当前工程的主链路。

这个架构里有两个很重要的词:结构化 和 可降级

结构化,意味着我们尽量保留文档自己的语义,别把一切都压成一张图。可降级,意味着遇到暂时不支持的对象,也要留下 warning、fallback 和元数据,方便后续继续追。

项目还在持续努力中,目标也很务实:先覆盖高频文档,再用真实样例不断补齐那些难啃的结构。

DOC:从 FIB 和 CLX 里找回正文

.doc 是最费心的一块。

你是不是以为 Word 文档的正文就存在某个连续区域里?很遗憾,真实情况更绕。.doc 需要先解析 CFB,找到 /WordDocument,再根据 FIB 判断使用 /0Table 还是 /1Table。正文位置还要通过 CLX 和 piece table 映射回来。

msdoc-viewer 的入口大致是这样:

exportfunctionparseMsDoc(inputArrayBuffer | Uint8Array | ArrayBufferViewoptionsMsDocParseOptions = {}): MsDocParseResult {const cfb = parseCFB(input, options);const wordBytes = cfb.getStream('/WordDocument');if (!wordBytes) thrownewError('Missing WordDocument stream');const fib = parseFib(wordBytes);const tableBytes = cfb.getStream(fib.base.fWhichTblStm ? '/1Table' : '/0Table');if (!tableBytes) thrownewError('Missing table stream');const clx = parseClx(tableBytes, fib.fibRgFcLcb);const pieceTexts = buildPieceTextCache(wordBytes, clx);const documentText = pieceTexts.join('');}

CLX 这一步特别能体现二进制 Office 的味道。它不直接给你正文,而是告诉你:某个 CP 范围应该去文件里的哪个 FC 偏移读,读出来还可能是压缩字符,也可能是 UTF-16LE。

exportfunctionparseClx(tableBytesUint8ArrayfibRgFcLcbFibRgFcLcb): ParsedClx {const fcClx = fibRgFcLcb.fcClxasnumber | undefined;const lcbClx = fibRgFcLcb.lcbClxasnumber | undefined;if (fcClx == null || lcbClx == null || lcbClx <= 0) {thrownewError('FIB does not point to a CLX structure');  }const clxBytes = tableBytes.subarray(fcClx, fcClx + lcbClx);const reader = newBinaryReader(clxBytes);// 读取 Prc,定位 Pcdt,再解析 PlcPcd}

正文能读出来,只是第一步。后面还有段落属性、字符属性、节、页眉页脚、脚注尾注、批注、书签、列表、对象、图片、浮动框。每补一个结构,预览就更像文档一点。

图片:你看到一张图,代码可能跑了半个文件

Office 图片很少只是一个图片字节。

在 .doc 里,它可能来自 PICFAndOfficeArtData,也可能来自 Drawing Group;有些图片通过 OfficeArtBStoreContainer 记录,有些 BLIP 只是一个延迟引用,还要回到 WordDocument 或 Data stream 里继续找。

项目里对 BLIP 记录做了专门处理:

functionextractBlipPayload(bytesUint8ArrayoffsetnumberheaderOfficeArtRecordHeader): PictureCandidate | null {const uidCount = (header.recInstance & 0x1) === 1 ? 2 : 1;const uidBytes = uidCount * 16;const atom = bytes.subarray(offset + 8, offset + 8 + header.recLen);if (header.recType === OFFICEART_BLIP_PNG || header.recType === OFFICEART_BLIP_JPEG) {const payload = atom.subarray(uidBytes + 1);return { mime, bytes: payload, displayableisBrowserDisplayableMime(mime) };  }if (header.recType === OFFICEART_BLIP_EMF || header.recType === OFFICEART_BLIP_WMF) {const payload = atom.subarray(uidBytes + 34);return {      mime,bytes: payload,displayablefalse,meta: { metafileCompression, metafileFilter }    };  }}

这里最有挑战的是 EMF / WMF。浏览器不认识它们,很多老文档又特别爱用它们。当前工程会尽量把可读的 EMF / WMF 转成 SVG;遇到压缩 metafile,还需要先解压,再走矢量记录解释。

最近 demo 里就修过一个很具体的问题:DOC 样例中有 11 个压缩 EMF,原本会落成不可显示资源。修完之后,全部转成了 SVG:

asyncfunctionrestoreMsDocVectorAssets(parsed, convertMetafileToSvg) {const vectorAssets = (parsed.assets || []).filter((asset) => (    asset?.type === 'image' && /^image\/(?:emf|wmf)$/i.test(asset.mime)  ));for (const asset of vectorAssets) {const payload = awaitextractMsDocMetafilePayload(asset);const converted = payload ? convertMetafileToSvg(asset.mime, payload) : null;if (!converted) continue;    asset.mime = converted.mime;    asset.bytes = converted.bytes;    asset.dataUrl = converted.dataUrl;    asset.displayable = true;  }}

这类修复很小,也很让人开心。它帮你解决的痛点很具体:旧 Word 文档里那些原本只有 Office 能看懂的矢量内容,开始能被浏览器接住。

DOCX:XML 友好一些,分页依然硬

.docx 是 ZIP + OPC + WordprocessingML,入口比 .doc 温柔很多。但只要你做过 Word 预览,就知道 XML 不等于简单。

样式继承、编号、多级列表、脚注、页眉页脚、域、图表、VML、DrawingML、表格分页、孤行控制,这些都在等着你。

@wybaby168/docx-viewer 里有一个关键细节:渲染完成不只看 DOM 是否插入,还要等图片、字体和动态分页稳定。

exportasyncfunctionrenderAsync(dataBlob | anybodyContainerHTMLElement, styleContainer?: HTMLElement, userOptions?: Partial<Options>): Promise<any> {const ops = { ...defaultOptions, ...userOptions };const doc = awaitparseAsync(data, ops);const nodes = awaitrenderDocument(doc, ops);for (let n of nodes) {const c = n.nodeName === "STYLE" ? styleContainer : bodyContainer;    c.appendChild(n);  }if (ops.awaitLayout) {awaitawaitRenderedLayout(bodyContainer, ops);  }return doc;}

分页这件事非常现实。浏览器负责 layout,Word 有自己的分页逻辑,中间一定有差异。当前实现会用 DOM 测量做动态分页,遇到溢出的段落和表格,再尝试拆到下一页:

splitOverflowBlock(blockHTMLElementpageHTMLElementnextArticleHTMLElement): boolean {if (block.dataset.docxKeepLines == "true"returnfalse;const style = getComputedStyle(block);if (style.breakInside == "avoid"returnfalse;switch (block.tagName.toLowerCase()) {case"p":returnthis.splitParagraphBlock(block, page, nextArticle);case"table":returnthis.splitTableBlock(block asHTMLTableElement, page, nextArticle);  }returnfalse;}

这段代码没有什么花哨技巧,却很接近文档预览的本质:帮你把 Word 的版式意图,尽量翻译成浏览器能执行的布局动作。

PPT:老格式里的母版、图层和矢量图

.ppt 很像一个旧时代的舞台记录。它有 Current User,有 PowerPoint Document,有 Persist Map,还有 slide、master、notes、pictures、OfficeArt。

解析入口先从 CFB 中取出关键流,再根据当前编辑链恢复对象映射:

exportfunctionparsePptBinary(inputArrayBuffer | Uint8ArrayoptionsPptParseOptions = {}): PptPresentation {const compoundFile = parseCompoundFile(input);const currentUserStream = compoundFile.readStream('Current User');const powerPointDocumentStream = compoundFile.readStream('PowerPoint Document');const picturesStream = compoundFile.getEntry('Pictures')    ? compoundFile.readStream('Pictures')    : undefined;const currentUser = parseCurrentUserInfo(currentUserStream);const persistInfo = buildPersistObjectMap(powerPointReader, currentUser.offsetToCurrentEdit);}

PPT 的图形非常磨人。一个 shape 可能包含 fill、line、rotation、placeholder、text、group transform,还可能带 Metro blob。渲染时要把它们拆成 HTML、CSS 和 SVG:

const metroComplex = propertyValue(properties, 937)?.complexData;constmetroBlobPptMetroBlob | undefined = metroComplex ? { bytes: metroComplex.slice() } : undefined;constbasePptShapeBase = {id: shapeId,typeId: shapeType,typeNameshapeTypeName(shapeType),fillparseFill(properties),lineparseLine(shapeType, properties),zIndex: context.zCounter.value += 1,};if (metroBlob !== undefined) {  base.metroBlob = metroBlob;}

这里还有一个实际踩过的坑:同步渲染路径在浏览器里容易漏掉某些异步矢量转换。切到 parsePpt() 和 renderPptHtmlAsync() 后,EMF / WMF 与 Metro 渲染链路才能完整走完:

if (format === 'ppt') {const { parsePpt, renderPptHtmlAsync } = awaitloadViewerModule('ppt');const parsed = awaitparsePpt(bytes, {});  elements.preview.innerHTML = parsed.html || awaitrenderPptHtmlAsync(parsed);}

你是不是也遇到过 PPT 首页能显示、后面图形全乱的情况?很多时候问题就藏在母版、图层、group 坐标系和矢量资源里。它们不显眼,但每一项都影响最终画面。

PPTX:现代格式也有自己的脾气

.pptx 更现代,结构也更清晰。可 PresentationML 的难点,集中在关系和继承。

一页 slide 往往引用 layout,layout 引用 master,master 引用 theme。颜色、字体、背景、占位符、默认文本样式,可能来自任何一层。

pptx-viewer 的主流程会先打开 package,再解析 themes、masters、layouts 和 slides:

exportasyncfunctionparsePptx(sourceBinarySourceoptionsParseOptions = {}): Promise<PptxDocument> {const packageStore = awaitopenPackage(source, {assetMode: options.assetMode ?? 'data-uri',onProgress: options.onProgress  });const presentationRoot = await packageStore.getXml(packageStore.info.presentationPath);const presentationRelationships = packageStore.getRelationships(packageStore.info.presentationPath);const themeParts = awaitparseThemes(packageStore, options);const slideMasters = awaitparseSlideMasters(...);const slideLayouts = awaitparseSlideLayouts(...);const slides = awaitparseSlides(...);}

真正渲染某一页时,要把 master、layout 和 slide 自己的元素合并起来,还要处理 placeholder 是否被占用、是否应该继承、zIndex 怎么错开:

functionmergeInheritedSlideElements(slideRootXmlElement,slideElementsSlideElement[],layoutSlideLayoutModel | undefined,masterSlideMasterModel | undefined): SlideElement[] {const slidePlaceholderKeys = collectPlaceholderKeySet(slideElements);const visibleMasterElements = masterShapesVisible(slideRoot, layout)    ? filterInheritedElements(master?.elements ?? [], masterOccupiedKeys)    : [];const visibleLayoutElements = filterInheritedElements(layout?.elements ?? [], slidePlaceholderKeys);return [    ...visibleMasterElements.map((element) =>offsetElementZIndex(element, 0)),    ...visibleLayoutElements.map((element) =>offsetElementZIndex(element, layoutOffset)),    ...slideElements.map((element) =>offsetElementZIndex(element, slideOffset))  ];}

这一步做好了,PPTX 才会像一页真正的幻灯片:母版背景、页脚、占位符默认样式都能回到画面里。

现在做到哪了

当前 demo 里,四类样例都已经能端到端预览:

格式
样例结果
阶段性能力
DOC
602 个块,11 个压缩 EMF 转 SVG
CFB / FIB / CLX / OfficeArt / floating shape
DOCX
99 页,56 张图片
WordprocessingML / 样式 / 编号 / 动态分页
PPT
35 页
Persist Map / OfficeArt / EMF/WMF / Metro blob
PPTX
35 页,32 个 masters,530 个 layouts
OPC / relationships / theme / master-layout-slide

这些数字更像路标,提醒我们已经走到了哪里。

项目还在持续努力中。后续会继续补真实文件里的复杂对象、更多 OfficeArt 记录、表格边界、字体度量、动画与媒体降级,也会探索更轻量的 WASM 分发与发布形态,让解析能力在更多运行环境里更容易被复用。

写在最后

如果你的系统也有 Office 预览痛点,希望文件少流转一点、部署轻一点、前端可控一点,这类纯前端方案值得认真看看。

它不会一下子替代完整 Office 套件,也不会承诺每份历史文件都像原生 Office 一样毫厘不差。可它已经能帮我们解决一批很现实的问题:在浏览器里直接打开文件,尽量还原主要内容,保留结构化信息,遇到困难也给出可追踪的 fallback。

很多工程就是这样慢慢长出来的。

先让一个文件亮起来。再让一类图片亮起来。再让一个母版、一段分页、一组矢量图回到它该在的位置。  

这条路还有很多细节要补,但它已经从纸面想法落进了浏览器,真实地渲染出了 DOC、DOCX、PPT 和 PPTX。

这就足够让人愿意继续往前走。

参考资料

  • Microsoft Learn: MS-DOC Word (.doc) Binary File Format[1]
  • Microsoft Learn: MS-PPT PowerPoint (.ppt) Binary File Format[2]
  • Microsoft Learn: MS-CFB Compound File Binary File Format[3]
  • Microsoft Support: Learn about file formats[4]
  • Microsoft Q&A: Need to render office documents in native form on the browser applications[5]
  • Seafile Admin Manual: Office Documents Preview with LibreOffice[6]

引用链接

[1]MS-DOC Word (.doc) Binary File Format: https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-doc/ccd7b486-7881-484c-a137-51170af7cc22

[2]MS-PPT PowerPoint (.ppt) Binary File Format: https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-ppt/6be79dde-33c1-4c1b-8ccc-4b2301c08662

[3]MS-CFB Compound File Binary File Format: https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-cfb/53989ce4-7b05-4f8d-829b-d08d6148375b

[4]Learn about file formats: https://support.microsoft.com/en-us/office/learn-about-file-formats-56dc3b55-7681-402e-a727-c59fa0884b30

[5]Need to render office documents in native form on the browser applications: https://learn.microsoft.com/en-us/answers/questions/5093946/need-to-render-office-documents-in-native-form-on

[6]Office Documents Preview with LibreOffice: https://manual.seafile.com/11.0/deploy_pro/office_documents_preview/

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-01 01:12:31 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/570469.html
  2. 运行时间 : 0.165079s [ 吞吐率:6.06req/s ] 内存消耗:4,671.60kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=dcaaaaf42830dca87e15ca1a3bf00874
  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.000557s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000574s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.004897s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.013446s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000835s ]
  6. SELECT * FROM `set` [ RunTime:0.000230s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000560s ]
  8. SELECT * FROM `article` WHERE `id` = 570469 LIMIT 1 [ RunTime:0.001178s ]
  9. UPDATE `article` SET `lasttime` = 1777569151 WHERE `id` = 570469 [ RunTime:0.010579s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.005079s ]
  11. SELECT * FROM `article` WHERE `id` < 570469 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001578s ]
  12. SELECT * FROM `article` WHERE `id` > 570469 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.005531s ]
  13. SELECT * FROM `article` WHERE `id` < 570469 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001557s ]
  14. SELECT * FROM `article` WHERE `id` < 570469 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.019935s ]
  15. SELECT * FROM `article` WHERE `id` < 570469 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001296s ]
0.168978s