乐于分享
好东西不私藏

PDF Inspector:毫秒级PDF解析与智能分类实战指南

PDF Inspector:毫秒级PDF解析与智能分类实战指南

一、引言:PDF 处理的两极世界

PDF 文件的本质存在一条深刻的分界线:约有 54%的 PDF 是数字生成的文本型 PDF,剩余部分是扫描型或图片型 PDF。在实际业务中,大量 PDF 被无差别地送入 OCR 服务处理,既浪费成本又拖慢效率——OCR 服务按页收费,单页延迟在 2-10 秒之间。

Firecrawl 团队开源的pdf-inspector给出了另一种思路:先分类、后处理。纯 Rust 编写、无任何机器学习模型依赖的轻量级库,能在 10-50 毫秒内完成 PDF 类型判断,检测为文本型后直接提取,整个过程在 200 毫秒内完成。本文将从源码分析到实战部署,完整呈现这一工具的使用全貌。

二、项目概述

pdf-inspector是由 Firecrawl 开发的 PDF 处理库,GitHub 仓库地址为firecrawl/pdf-inspector,在发布后已获得 516 颗 Star。其核心价值定位是:为纯文本 PDF 跳过昂贵的 OCR 流程,实现毫秒级本地处理。

2.1 功能一览

根据官方 README,pdf-inspector 提供以下能力:

  • 智能分类:在 10-50 毫秒内检测 PDF 类型,包括 TextBased(文本型)、Scanned(扫描型)、ImageBased(图片型)和 Mixed(混合型),并提供置信度评分(0.0-1.0)以及每页是否需要 OCR 的建议。
  • 文本提取:位置感知的文本提取,包含字体信息、XY 坐标,支持多栏阅读顺序自动识别。
  • Markdown 转换:支持标题(H1-H4 基于字体大小比例)、列表(编号、项目符号)、代码块(等宽字体检测)、表格、加粗/斜体格式、URL 链接和分页标记。
  • 表格检测:双重模式——基于 PDF 绘图指令的矩形检测 + 基于文本对齐的启发式检测。
  • CID 字体支持:支持 Type0/Identity-H 字体的 ToUnicode CMap 解码,兼容 UTF-16BE、UTF-8 和 Latin-1 编码。
  • 编码问题检测:自动标记异常的字体编码,供调用方降级到 OCR。
  • 单次文档加载:文档只解析一次,分类和提取共享同一份数据。
  • 轻量级:纯 Rust 实现,无 ML 模型,无外部服务,仅依赖lopdf库。

2.2 性能基准

官方在 opendataloader-bench 语料库(200 个 PDF)上进行了基准测试。对比的是纯文本提取引擎(不使用 OCR/ML),结果如下:

引擎
综合得分
阅读顺序
表格检测
标题识别
200 文档总耗时
pdf-inspector0.780.870.59
0.57
4 秒
opendataloader
0.84
0.91
0.49
0.74
11 秒
pymupdf4llm
0.73
0.89
0.40
0.41
18 秒
markitdown
0.58
0.88
0.00
0.00
8 秒

pdf-inspector 在速度上是最快的,阅读顺序得分仅次于 opendataloader,表格检测在所有直接文本提取工具中表现最优。标题识别方面,由于许多 PDF 使用与正文相同字体大小的粗体文本作为标题,或标题字体仅略大于正文,pdf-inspector 在这方面仍有改进空间。作为对比,使用 OCR/ML 的引擎(如 docling、marker、mineru)综合得分可达 0.83-0.88,但处理同一语料库耗时高达 2-180 分钟。

三、工作原理与架构解析

3.1 核心流程

pdf-inspector 的架构分为四个阶段:

PDF字节    │    ├──► 分类器(detector):采样→返回PDF类型    │    └──► 提取器(extractor)          ├── 字体 → 字体宽度、编码信息          ├── 内容流 → 遍历PDF操作符 → TextItems + PdfRects          ├── XObjects → Form XObject文本、图片占位符          ├── 链接 → 超链接、AcroForm表单字段          ├── 布局分析 → 栏检测→行分组→阅读顺序          ├── 表格检测          │     ├── 矩形检测(union-find合并重叠矩形)          │     ├── 启发式检测(对齐检测)          │     └── 网格化 → 列/行分配 → 单元格 → Markdown表格          └── Markdown生成                ├── 分析 → 字体统计、标题层级                ├── 预处理 → 标题合并、首字下沉处理                ├── 转换 → 行循环 + 表格/图片插入                ├── 分类 → 图表标题、列表、代码块识别                └── 后处理 → 清理 → 最终Markdown

3.2 智能分类的底层逻辑

pdf-inspector 的分类算法基于一个关键洞察:文本型 PDF 的内容流中包含TjTJ操作符(文本绘制指令),而扫描型 PDF 则包含大量的Do操作符(图像绘制指令)。

分类器的实现策略是:

  1. 采样而非全量解析:不加载整个文档,只解析 xref 表和页面树。
  2. 快速判断:检查内容流中是否包含文本操作符和图像操作符,结合字体编码的有效性进行评分。
  3. 置信度输出:返回 0.0-1.0 之间的置信度分数,以及pages_needing_ocr列表,便于调用方做路由决策。

这种设计的精妙之处在于一次加载、多次复用——文档只解析一次,分类和提取共享同一份数据,完全避免了冗余 I/O。

3.3 表格检测的双重模式

  • 矩形检测模式:遍历 PDF 绘图操作,收集所有矩形对象,通过 union-find 算法合并相邻重叠的矩形,推断表格结构。
  • 启发式检测模式:基于文本的对齐特性,检测文本是否按列对齐,适用于没有明确矩形边框的表格。

两种模式结合,使得 pdf-inspector 能处理金融报表中的无边框表格、跨页续表以及带脚注的复杂表格,在直接文本提取工具中表格检测得分最高(0.59)。

3.4 多栏布局与阅读顺序

针对报纸、学术论文等具有多栏排版特征的 PDF,pdf-inspector 会自动检测栏结构,按自上而下、从左到右的顺序输出文本,并支持 RTL(从右向左)语言。

四、环境准备与基本条件

4.1 通用前提条件

操作系统

  • Linux(x86_64)
  • macOS(ARM64 / x86_64)

开发工具链:根据使用语言不同,要求如下:

语言
Rust 工具链
Node.js
Python
说明
Rust
✅ 必需
需要 Rust 和 Cargo
Python
✅ 必需
✅ 3.7+
PyO3 绑定,需要本地构建
Node.js
❌ 不需要
✅ 14+
预编译二进制,开箱即用

⚠️ 重要提示:pdf-inspector 目前不能从 crates.io 直接安装,必须通过 Git 引用。

4.2 Rust 环境准备(跨语言通用)

由于 Python 绑定需要在本地编译 Rust 代码,所有语言的使用者最终都需要一个可用的 Rust 环境。

步骤 1:安装 Rust

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource ~/.cargo/envrustc --version

步骤 2:验证 Cargo

cargo --version

4.3 各语言详细安装指南

Python

# 安装maturin(PyO3构建工具)pip install maturin# 克隆仓库git clone https://github.com/firecrawl/pdf-inspectorcd pdf-inspector# 构建Python绑定maturin develop --release# 验证导入python -c "import pdf_inspector; print('安装成功')"

常见问题:安装过程中若出现编译错误,请确保 Rust 工具链版本至少为 1.70+,并检查是否已安装系统级构建工具(如 build-essential 或 Xcode Command Line Tools)。

Node.js

Node.js 用户享有最便捷的体验——有预编译二进制文件,无需安装 Rust 工具链。

npm install @firecrawl/pdf-inspector# 或bun add @firecrawl/pdf-inspector

支持的平台:

  • Linux x64
  • macOS ARM64(Apple Silicon)
  • macOS x64(Intel,通过 Rosetta 2)

Rust

在项目的Cargo.toml中添加:

[dependencies]pdf-inspector = { git = "https://github.com/firecrawl/pdf-inspector" }

CLI 使用

CLI 需要从源码构建:

git clone https://github.com/firecrawl/pdf-inspectorcd pdf-inspector# 将PDF转换为Markdowncargo run --bin pdf2md -- document.pdf# 仅检测(不提取)cargo run --bin detect-pdf -- document.pdf

五、实战案例

5.1 Python:端到端 PDF 智能解析

以下代码完整演示了从 PDF 上传到类型路由的流程。

import pdf_inspectorfrom pathlib import Pathimport sysdef smart_pdf_processor(pdf_path: str):    """    智能PDF处理器:自动判断PDF类型并选择最优处理路径    """    # 第一步:快速检测(不加载完整文档)    print("[1/3] 正在检测PDF类型...")    detection = pdf_inspector.detect_pdf(pdf_path)    print(f"  PDF类型: {detection.pdf_type}")    print(f"  置信度: {detection.confidence:.2f}")    print(f"  总页数: {detection.page_count}")    needs_ocr_pages = detection.pages_needing_ocr    if needs_ocr_pages:        print(f"  需要OCR的页面: {needs_ocr_pages}")    # 第二步:根据分类结果选择处理路径    if detection.pdf_type == "text_based":        print("[2/3] 文本型PDF → 使用本地提取")        return _extract_text_pdf(pdf_path)    elif detection.pdf_type == "mixed":        print("[2/3] 混合型PDF → 分页处理")        return _process_mixed_pdf(pdf_path, detection.pages_needing_ocr)    else:        print("[2/3] 扫描/图片型PDF → 应调用OCR服务")        return {"status""ocr_required""pages": detection.pages_needing_ocr}def _extract_text_pdf(pdf_path: str):    """全量提取文本型PDF"""    result = pdf_inspector.process_pdf(pdf_path)    print(f"  处理耗时: {result.processing_time_ms:.1f}ms")    print(f"  包含表格的页面: {result.pages_with_tables}")    print(f"  多栏布局: {result.is_complex_layout}")    # 保存Markdown    if result.markdown:        output_path = Path(pdf_path).with_suffix('.md')        output_path.write_text(result.markdown, encoding='utf-8')        print(f"[3/3] ✅ Markdown已保存至: {output_path}")    return {"status""success""markdown": result.markdown}def _process_mixed_pdf(pdf_path: str, needs_ocr_pages: list):    """处理混合型PDF:分页判断"""    # 按页提取Markdown    result = pdf_inspector.extract_pages_markdown(pdf_path)    for page_result in result.pages:        if page_result.needs_ocr:            print(f"  第{page_result.page+1}页 → 需要OCR")        else:            print(f"  第{page_result.page+1}页 → 文本提取 ({len(page_result.markdown)}字符)")    return {"status""mixed""needs_ocr_pages": needs_ocr_pages}# 执行示例if __name__ == "__main__":    if len(sys.argv) > 1:        result = smart_pdf_processor(sys.argv[1])        print(f"\n最终结果: {result}")    else:        print("用法: python processor.py <PDF文件路径>")

位置敏感文本提取

def extract_with_coordinates(pdf_path: str):    """提取文本及其位置坐标,可用于构建PDF预览高亮"""    items = pdf_inspector.extract_text_with_positions(pdf_path)    for item in items[:10]:  # 打印前10项        print(f"'{item.text}' 位于 ({item.x:.0f}{item.y:.0f}) "              f"字体={item.font} 大小={item.font_size} "              f"加粗={item.is_bold} 斜体={item.is_italic}")    return items

5.2 Node.js:混合 OCR 管线集成

Node.js API 专为混合 OCR 管线设计——先用 pdf-inspector 快速判断,仅对需要 OCR 的页面/区域调用 OCR 服务。

import { readFileSync } from 'fs';import { classifyPdf, extractTextInRegions, PageRegions } from '@firecrawl/pdf-inspector';interface ProcessingResult {  successboolean;  textstring;  ocrFallbackPagesnumber[];}async function smartPdfProcessor(filePathstring): Promise<ProcessingResult> {  const pdfBuffer = readFileSync(filePath);  // 第一步:全文档分类,确定哪些页面需要OCR  const classification = classifyPdf(pdfBuffer);  console.log(`PDF类型: ${classification.pdfType}`);  console.log(`置信度: ${classification.confidence}`);  console.log(`需要OCR的页面: ${classification.pagesNeedingOcr}`);  // 如果整个文档都是文本型,直接提取  if (classification.pdfType === 'TextBased') {    // 区域提取示例:提取全页(PDF标准尺寸为612x792点)    const pageRegionsPageRegions[] = [];    for (let i = 0; i < classification.pageCount; i++) {      pageRegions.push({        page: i,        regions: [[00612792]]  // 全页范围      });    }    const results = extractTextInRegions(pdfBuffer, pageRegions);    let fullText = '';    for (const pageResult of results) {      for (const region of pageResult.regions) {        if (!region.needsOcr) {          fullText += region.text + '\n';        }      }    }    return { successtruetext: fullText, ocrFallbackPages: [] };  }  // 混合型:分区域路由  // 实际项目中,需要配合布局检测模型来定位具体区域坐标  // 此处仅演示区域提取API的使用方式  const regionsToCheckPageRegions[] = classification.pagesNeedingOcr.map(page => ({    page,    regions: [      [100100300200],  // 需要OCR的具体区域坐标(左上x, 左上y, 右下x, 右下y)    ]  }));  const regionResults = extractTextInRegions(pdfBuffer, regionsToCheck);  // region.needsOcr为true表示该区域提取不可靠,应送入OCR服务  const ocrRegions = regionResults.flatMap(page =>    page.regions.filter(r => r.needsOcr)  );  return {    successtrue,    text'需要OCR的区域: ' + ocrRegions.length,    ocrFallbackPages: classification.pagesNeedingOcr  };}// 运行示例smartPdfProcessor('./document.pdf').then(console.log);

5.3 Rust:高性能批处理

Rust 原生 API 适合高吞吐量的批处理场景。

use pdf_inspector::process_pdf;use std::path::Path;use std::time::Instant;fnbatch_process_pdfs(pdf_paths: Vec<&str>{    for path in pdf_paths {        let start = Instant::now();        match process_pdf(path) {            Ok(result) => {                let elapsed = start.as_millis();                println!(                    "{} | 类型={:?} | 置信度={:.2} | 页数={} | 耗时={}ms | MD长度={}",                    Path::new(path).file_name().unwrap().to_string_lossy(),                    result.pdf_type,                    result.confidence,                    result.page_count,                    elapsed,                    result.markdown.as_ref().map(|m| m.len()).unwrap_or(0)                );            }            Err(e) => eprintln!("处理失败 {}: {}", path, e),        }    }}fnmain() {    let docs = vec!["report1.pdf""report2.pdf""scanned_doc.pdf"];    batch_process_pdfs(docs);}

5.4 CLI:单文件快速处理

对于快速测试和脚本集成,CLI 是最便捷的入口:

# 基础用法:转换为Markdowncargo run --bin pdf2md -- document.pdf# JSON格式输出(便于管道处理)cargo run --bin pdf2md -- document.pdf --json# 仅原始文本,无Markdown格式cargo run --bin pdf2md -- document.pdf --raw# 保留分页标记cargo run --bin pdf2md -- document.pdf --pages# 仅处理指定页码cargo run --bin pdf2md -- document.pdf --select-pages 1,3,5-10# 仅检测(不提取)cargo run --bin detect-pdf -- document.pdfcargo run --bin detect-pdf -- document.pdf --jsoncargo run --bin detect-pdf -- document.pdf --analyze --json  # 包含布局分析

六、项目源码结构导航

深入源码前,先了解其目录结构,有助于快速定位需要修改或扩展的功能模块。

pdf-inspector/├── src/│   ├── lib.rs              # 公共API入口、PdfOptions构建器│   ├── python.rs           # PyO3 Python绑定│   ├── types.rs            # 共享类型定义:TextItem、TextLine、PdfRect、ItemType│   ├── text_utils.rs       # 字符/文本辅助函数(CJK、RTL、连字、加粗/斜体检测)│   ├── process_mode.rs     # ProcessMode枚举(DetectOnly、Analyze、Full)│   ├── detector.rs         # 快速PDF类型检测(不加载完整文档)│   ├── glyph_names.rs      # Adobe字形列表 → Unicode映射│   ├── tounicode.rs        # ToUnicode CMap解析(用于CID编码字体)│   ├── extractor/          # 文本提取管线│   ├── tables/             # 表格检测和格式化│   └── markdown/           # Markdown生成器├── napi/                   # Node.js绑定(napi-rs)├── docs/│   ├── python.md           # Python API完整文档│   ├── rust-api.md         # Rust API完整文档│   └── napi/README.md      # Node.js API文档└── Cargo.toml

如果需要在特定场景下做定制开发(如扩展表格检测逻辑、调整标题识别阈值),可从上述对应目录入手。

七、进阶优化与扩展

7.1 与 OCR 服务混合部署

pdf-inspector 的最佳实践是与 OCR 服务形成“分级处理”管线:

PDF输入        ┌─────────────────┐ pdf-inspector     ◄── 10-50ms 分类检测        └─────────────────┘        ├──► TextBased ──► 直接本地提取 (150ms)                                                                          Markdown输出        └──► Scanned/Mixed ──► 送入OCR服务 (2-10s/页)                                                                                        OCR结果

在 Firecrawl 的 Fire-PDF 引擎中,这一策略使得纯文本页完全跳过 GPU,仅将扫描件或图片密集的页面送入神经网络布局模型和 GLM-OCR 视觉语言模型处理,最终实现了 3.5-5.7 倍的提速。

7.2 内存与性能调优

批量处理建议

  • 使用process_pdf一次性完成分类+提取+Markdown 转换,利用单次文档加载机制避免重复 I/O。
  • 在处理大批量 PDF 时,建议使用 Rust 原生 API 并通过 Rayon 等库实现并行处理,当前设计下分类器在 10-50ms 内即可完成判断。

内存占用控制

  • process_pdf_bytes接口支持从内存字节直接处理,避免频繁的文件系统操作。
  • 对于超大 PDF(如数百页),可用extract_pages_markdown分页处理,逐页流式输出。

八、总结与最佳实践

核心适用场景

  • 智能 OCR 路由:作为 OCR 服务的“前置过滤器”,先快速判断 PDF 类型,对文本型 PDF 直接提取,显著降低 OCR 调用成本和延迟。
  • 文档预处理管线:为 RAG(检索增强生成)系统提供高质量、结构化文档数据。
  • 日志分析与报表处理:处理金融财报、学术论文等多栏、含表格的复杂文档。
  • 本地优先的隐私合规场景:纯本地处理,无外部 API 调用,数据完全可控。

已知局限

  1. 标题识别:部分使用与正文字体大小相同或仅略大的粗体文本作为标题的 PDF,标题识别准确率低于 opendataloader(0.57 vs 0.74)。
  2. 纯图片型 PDF:对完全由图像构成的 PDF,需降级到 OCR 服务处理。
  3. 复杂视觉表格:表格检测相比使用 OCR/ML 的引擎仍有差距,后者能“看见”视觉表格结构。
  4. 安装门槛:Python 用户需要本地编译,不如 pip install 即装即用那么便捷。

最佳实践建议

建议
说明
先分类、后处理
始终使用detect_pdf做前置判断,根据结果路由处理路径
利用pages_needing_ocr字段
对于混合型 PDF,只对需要 OCR 的页面调用 OCR 服务
缓存处理结果
对于重复处理的文档,建议缓存process_pdf结果,避免重复解析
结合字体分析调整规则
若标题识别需求严格,可参考源码中字体统计逻辑自行调整标题阈值
生产环境使用 Node.js
Node.js 绑定提供预编译二进制文件,部署最简便
优先使用process_pdf_bytes
减少文件系统操作,直接从内存处理

pdf-inspector 通过巧妙的分类策略和轻量级架构,为文本型 PDF 处理开辟了一条低成本的路径。在混合 PDF 场景下,它与 OCR 服务形成完美的互补组合,值得纳入每一套文档处理系统的工具库中。

无论身在何处

有我不再孤单孤单

长按识别二维码关注我们

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-29 19:14:50 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/676119.html
  2. 运行时间 : 0.107115s [ 吞吐率:9.34req/s ] 内存消耗:4,670.38kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0b8b512e435a2bfd3eaa9a6a5decd83c
  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.000570s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000720s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000332s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000305s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000679s ]
  6. SELECT * FROM `set` [ RunTime:0.000312s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000721s ]
  8. SELECT * FROM `article` WHERE `id` = 676119 LIMIT 1 [ RunTime:0.000532s ]
  9. UPDATE `article` SET `lasttime` = 1780053290 WHERE `id` = 676119 [ RunTime:0.006137s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000433s ]
  11. SELECT * FROM `article` WHERE `id` < 676119 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000666s ]
  12. SELECT * FROM `article` WHERE `id` > 676119 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004009s ]
  13. SELECT * FROM `article` WHERE `id` < 676119 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000919s ]
  14. SELECT * FROM `article` WHERE `id` < 676119 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001295s ]
  15. SELECT * FROM `article` WHERE `id` < 676119 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001000s ]
0.109638s