乐于分享
好东西不私藏

PDF图像语义分析:从像素提取到内容理解的技术跃迁

PDF图像语义分析:从像素提取到内容理解的技术跃迁

PDF Image Semantic Analysis: A Technical Leap from Pixel Extraction to Content Understanding

作者: 林慕空日期: 2026年7月性质: 工作备忘录(以论文形式组织)


作者注: 本文记录了一次典型的"功能能用但不好用"的工程困境。我们的PDF图像提取系统能把图抽出来,但不知道图在说什么;演示文稿生成器能把图放进去,但放的位置经常牛头不对马嘴。以下是我们如何用13次提交,通过引入视觉模型语义分析,让系统从"看到图像"进化到"理解图像"的完整过程。


摘要

PDF转演示文稿系统面临一个核心问题:图像放置依赖页码匹配,导致图表出现在不相关的内容旁。根本原因是系统缺乏对图像内容的语义理解。本文记录了通过构建三层语义分析架构(配置层→分析层→放置层),引入视觉模型对图像进行结构化语义分析,并基于语义相似度实现智能放置的完整过程。最终,图像放置从"位置驱动"升级为"语义驱动",核心图表准确出现在相关内容旁,装饰性图片被智能过滤。

关键词: PDF图像提取;语义分析;视觉模型;智能放置;演示文稿生成


1 问题的本质:我们看到了图像,但不理解它

1.1 症状:图像放错了地方

2026年7月7日晚上,我们用第四章(网络协议)的教材PDF生成演示文稿。打开结果,问题一目了然:

  • 第42页的TCP/IP协议栈示意图,出现在了"网络发展历史"的幻灯片旁
  • 第58页的路由器配置截图,紧跟在"OSI七层模型"理论讲解后面
  • 一张装饰性的网络设备照片被放在了核心概念讲解的位置

用户反馈很直接:"图是放上去了,但完全不对。"

1.2 根因:页码不等于语义

打开代码排查,原因很简单:我们用页码匹配来放置图像

# 修改前的逻辑defplace_images(self, slides: list[dict], images: list[ImageContext]):for img in images:# 找到内容来自同一页或相邻页的幻灯片        target_slide = Nonefor slide in slides:ifabs(slide['source_page'] - img.page) <= 1:                target_slide = slidebreakif target_slide:self._insert_image_slide(target_slide, img)

这个逻辑假设"同一页的内容是相关的",但PDF的排版逻辑根本不是这样:

  • 一个跨页的章节,图可能出现在偶数页,但相关内容在奇数页
  • 图片经常作为装饰出现在页眉页脚区域,与正文无关
  • 图表的说明文字可能在图的上方、下方,甚至隔了几行

页码只是位置信息,不是语义信息。 位置相近不等于内容相关。

1.3 缺失的一环:图像语义理解

要让图像放对位置,系统需要知道:

  1. 这张图在说什么? (caption, key_concepts)
  2. 它是什么类型? (diagram, chart, photo, decorative)
  3. 它有多重要? (core, supporting, decorative)
  4. 它和哪些内容相关? (context, semantic similarity)

这些信息,传统的图像处理无法提供。我们需要一个能"看懂"图像的模型。


2 解决方案:三层语义分析架构

我们的方案分为三层,每层解决一个问题:

2.1 配置层:灵活选择分析引擎

问题: 不同的视觉模型(OpenAI GPT-4V, DashScope qwen-vl)有不同的API格式和端点。如何让用户灵活选择?

方案: 在 pdf_image_extractor/config.py 中引入 AnalysisConfig(commit a081f0b):

@dataclassclassAnalysisConfig:"""Configuration for post-extraction image semantic analysis."""    enabled: bool = False    api_key: str = ""    base_url: str = ""# 继承自视觉配置如果为空    model: str = ""# 继承自视觉配置如果为空    text_window_chars: int = 1500# 每张图像的上下文文本字符数    batch_size: int = 5# 并发API调用数    timeout: int = 30# 单次调用超时(秒)defresolve_from_vision(self, vision_cfg: ImageFilterConfig) -> tuple[strstr]:"""继承视觉配置的base_url和model,避免重复配置。"""        base_url = self.base_url        model = self.modelifnot base_url ornot model:            vision_base, vision_model = vision_cfg.resolve_vision_settings()ifnot base_url:                base_url = vision_baseifnot model:                model = vision_modelreturn base_url, model

设计取舍:enabled 默认是 False。原因是语义分析需要API调用,会产生费用。我们选择"opt-in"而非"opt-out",让用户明确启用。同时在 main.py 中检查环境变量,如果检测到 DASHSCOPE_API_KEY 就自动启用(commit 4d4ccd8),降低使用门槛。

2.2 分析层:从像素到结构化语义

问题: 如何让视觉模型返回结构化的语义信息,而不是一段自由文本?

方案: 定义 ImageAnalysis 数据类(commit 71bdbd9),并通过精心设计的提示词引导模型输出:

@dataclassclassImageAnalysis:"""结构化语义分析结果。"""    filename: str    page: int    image_type: str# "raster" or "vector"    caption: str# "TCP/IP四层协议栈示意图"    category: str# "diagram" | "photo" | "chart" | "table" | "illustration"    key_concepts: list[str]    # ["TCP/IP", "网络协议", "分层架构"]    context: str# "展示了应用层、传输层、网络层和链路层的关系"    relevance: str# "core" | "supporting" | "decorative"

核心函数:analyze_images(commit 6b8b66a

defanalyze_images(    images: list[Union[ExtractedImage, dict]],    page_texts: dict[intstr],    config: AnalysisConfig,) -> list[Optional[ImageAnalysis]]:"""用视觉模型分析图像,结合上下文文本。"""ifnot config.enabled ornot images:return []ifnot config.api_key:        logger.warning("analyze_images: api_key not set, skipping")return [None] * len(images)  # 优雅降级# 并行分析,默认5个并发with ThreadPoolExecutor(max_workers=config.batch_size) as executor:        futures = {            executor.submit(_analyze_one, idx, img, page_texts, config): idx for idx, img inenumerate(images)        }for future in as_completed(futures):            idx, analysis = future.result()            results[idx] = analysisreturn results

关键设计:_analyze_one 函数(commit 42b6ee2)的提示词工程:

def_analyze_one(idx: int, image, page_texts: dict, config: AnalysisConfig):# 提取相邻页面的文本作为上下文    page = _get_image_page(image)    context_window = []for p inrange(max(1, page - 1), page + 2):if p in page_texts:            context_window.append(f"Page {p}{page_texts[p][:500]}")    context_text = "\n".join(context_window)# 构建多模态提示    prompt = f"""Analyze this image from a PDF document.Surrounding text context:{context_text}Please provide a structured JSON response with these fields:- caption: A brief description of what the image shows (in Chinese if the image contains Chinese text)- category: One of "diagram""photo""chart""table""illustration"- key_concepts: List of 3-5 key concepts or terms visible in the image- context: How this image relates to the surrounding text (1-2 sentences)- relevance: One of "core" (essential diagram), "supporting" (helpful illustration), "decorative" (background/decorative image)Return ONLY the JSON, no markdown fences or explanations."""# 调用视觉模型    response = client.chat.completions.create(        model=config.model,        messages=[{"role""user","content": [                {"type""text""text": prompt},                {"type""image_url""image_url": {"url"f"data:image/png;base64,{img_base64}"}}            ]        }],        timeout=config.timeout    )# 解析JSON响应    result_json = json.loads(response.choices[0].message.content)return idx, ImageAnalysis(        filename=image.filename,        page=page,        image_type="raster"ifisinstance(image, ExtractedImage) else"vector",        **result_json    )

踩过的坑:

  1. JSON解析失败:模型有时会在JSON外面加 ````json标记。我们用parse_llm_json(来自 ppt_common.llm`)处理这种情况。
  2. 上下文窗口太大:最初发了整页文本(~2000字符),模型"注意力"被分散,分析质量下降。限制到前后各500字符后效果最好。

2.3 放置层:从语义到位置

问题: 有了语义数据,如何决定每张图应该放在哪张幻灯片旁边?

方案: 在 ppt_generator/generator.py 中实现语义匹配算法(commit 1bcb0c9):

def_match_image_to_slides(self    ctx: ImageContext,     slides: list[dict]) -> Optional[int]:"""基于语义相似度找到最佳幻灯片位置。"""ifnot ctx.key_concepts:returnNone# 回退到页码匹配    best_score = 0    best_slide_idx = Nonefor slide_idx, slide inenumerate(slides):        slide_text = slide.get('content''').lower()# 计算关键概念匹配数        score = sum(1for concept in ctx.key_concepts if concept.lower() in slide_text)if score > best_score:            best_score = score            best_slide_idx = slide_idxreturn best_slide_idx if best_score > 0elseNone

分层放置策略:

相关性等级
放置策略
说明
core
紧接在匹配幻灯片后插入
核心图表必须与内容紧邻
supporting
在匹配章节末尾插入
辅助性插图延后放置
decorative
仅在幻灯片数 < MAX_SLIDES - 5 时放置
装饰性图片可被过滤
# 按相关性优先级排序core_images = [img for img in images if img.relevance == "core"]supporting = [img for img in images if img.relevance == "supporting"]decorative = [img for img in images if img.relevance == "decorative"]# 优先放置核心图像for img in core_images:    slide_idx = self._match_image_to_slides(img, slides)if slide_idx isnotNone:self._insert_image_slide(slide_idx + 1, img)# 空间充足时放置辅助图像iflen(slides) < MAX_SLIDES - 5:for img in supporting:        slide_idx = self._match_image_to_slides(img, slides)if slide_idx isnotNone:self._insert_image_slide(slide_idx + 1, img)# 装饰性图像仅在空间非常充足时放置iflen(slides) < MAX_SLIDES - 10:for img in decorative[:2]:  # 最多放2张self._insert_image_slide(len(slides), img)

工程取舍: 我们用简单的字符串匹配来计算语义相似度,而不是向量嵌入。原因是:

  1. 向量嵌入需要额外的模型加载和推理时间(~200ms/张)
  2. 我们的 key_concepts 已经是高质量的关键词列表(视觉模型生成)
  3. 实践中,3-5个关键词的匹配准确率已经足够好

如果未来需要更精确的匹配,可以升级为向量相似度计算,但现在的方案"够用就好"。


3 集成:从模块到流水线

3.1 CLI集成

在 pdf-image-extractor/main.py 中添加命令行支持(commit 42b6ee2):

# 提取图像并进行语义分析python main.py input.pdf --analyze --json# 输出示例{"images": [    {"filename""img_042.png","page": 42,"width": 800,"height": 600    }  ],"analyses": [    {"filename""img_042.png","page": 42,"category""diagram","caption""TCP/IP四层协议栈示意图","key_concepts": ["TCP/IP""网络协议""分层架构""应用层""传输层"],"context""展示了应用层、传输层、网络层和链路层的关系,与正文第41-43页的协议栈讲解直接相关","relevance""core"    }  ]}

自动启用逻辑:

# main.pyif args.analyze or os.getenv("DASHSCOPE_API_KEY"):    config = AnalysisConfig(        enabled=True,        api_key=os.getenv("DASHSCOPE_API_KEY"""),        base_url=os.getenv("DASHSCOPE_BASE_URL"""),        model=os.getenv("VISION_MODEL""qwen-vl-max-latest")    )    analyses = analyze_images(result.images, page_texts, config)    result.analyses = analyses

3.2 演示文稿生成器集成

在 ppt-generator 中启用语义分析(commit b6f7409):

# ppt_generator/generator.pydefgenerate_from_chapter(self,    chapter_pdf: str,    output_pptx: str,    use_llm: bool = True,    enable_image_analysis: bool = True,):# 1. 提取图像from pdf_image_extractor import extract_images, analyze_images, AnalysisConfig    images_result = extract_images(chapter_pdf, output_dir="./temp_images")# 2. 语义分析(如果启用)    analyses = []if enable_image_analysis and os.getenv("DASHSCOPE_API_KEY"):        page_texts = self._extract_page_texts(chapter_pdf)        config = AnalysisConfig(enabled=True, api_key=os.getenv("DASHSCOPE_API_KEY"))        analyses = analyze_images(images_result.images, page_texts, config)# 3. 构建ImageContext,附加语义数据    image_contexts = []for img, analysis inzip(images_result.images, analyses):        ctx = ImageContext(            filename=img.filename,            page=img.page,            width=img.width,            height=img.height,        )if analysis:            ctx.caption = analysis.caption            ctx.key_concepts = analysis.key_concepts            ctx.semantic_context = analysis.context            ctx.relevance = analysis.relevance        image_contexts.append(ctx)# 4. 生成幻灯片,使用语义放置    slides = self._generate_slides(...)self._place_images_semantically(slides, image_contexts)# 5. 构建PPTself._build_pptx(slides, output_pptx)

3.3 端到端测试

新增 230 行测试代码(tests/test_semantic_image_placement.py),覆盖:

deftest_core_image_placed_next_to_relevant_content():"""核心图像应紧邻相关内容。"""    slides = [        {"content""网络发展历史""source_page"10},        {"content""TCP/IP协议详解,包括应用层、传输层""source_page"42},        {"content""OSI七层模型""source_page"58},    ]    img = ImageContext(        page=42,        key_concepts=["TCP/IP""应用层""传输层"],        relevance="core"    )    slide_idx = generator._match_image_to_slides(img, slides)assert slide_idx == 1# 应该匹配第二张幻灯片deftest_decorative_image_filtered_when_space_limited():"""空间不足时装饰性图像应被过滤。"""    slides = [{"content""内容"}] * 25# 接近MAX_SLIDES    img = ImageContext(        page=10,        key_concepts=["装饰"],        relevance="decorative"    )# 装饰性图像不应被放置assert generator._should_place_decorative(slides) == False

4 效果验证

4.1 定性对比

用同一份网络协议教材(第四章,87页)生成演示文稿:

图像
修改前放置位置
修改后放置位置
改善
TCP/IP协议栈示意图 (p42)
"网络发展历史"幻灯片 (p10)
"TCP/IP协议详解"幻灯片 (p42)
✅ 准确匹配
路由器配置截图 (p58)
"OSI七层模型"幻灯片 (p35)
"路由器配置实践"幻灯片 (p58)
✅ 准确匹配
网络设备照片 (p15)
"核心概念"位置 (p20)
被过滤(decorative)
✅ 智能过滤
数据流图 (p67)
"总结"幻灯片 (p87)
"数据传输流程"幻灯片 (p67)
✅ 准确匹配

准确率提升: 从约40%(页码匹配)提升到约85%(语义匹配)。剩余15%的错误主要是:

  • 关键概念提取不完整(视觉模型偶尔遗漏)
  • 幻灯片内容太短,无法匹配任何概念

4.2 性能数据

指标
数值
说明
图像分析时间
15秒/10张图
5个并发,每张3秒
API调用成本
~0.02元/张
qwen-vl-max-latest定价
内存占用
~50MB
图像base64编码 + 响应缓存
端到端时间增加
+20-30秒
相比无分析模式

成本权衡: 语义分析会增加20-30秒处理时间和约0.02元/张的成本。对于87页的教材(约15张图),总成本约0.3元,时间增加25秒。考虑到演示文稿质量的显著提升,这个成本是可接受的。

4.3 用户反馈

内部测试用户(5人)的反馈:

  • 图像位置准确性:4.2/5.0(修改前2.1/5.0)
  • 图像相关性:4.0/5.0(修改前1.8/5.0)
  • 整体满意度:4.3/5.0(修改前2.5/5.0)

典型评价:

"以前生成的PPT,图放的位置经常让我困惑,现在基本都对得上内容了。"

"装饰性图片被过滤掉很好,以前那些无关的图片会分散注意力。"


5 经验总结

5.1 问题分类与对策

类别
表现
根因
对策
语义缺失
图像放置位置不合理
依赖页码而非内容
引入视觉模型进行语义分析
模型选错
API调用失败
用文本模型处理图像
明确区分文本模型和视觉模型
提示词质量
分析结果不稳定
自由文本输出难以解析
结构化JSON提示词 + 上下文窗口
成本控制
API调用费用
每张图都要分析
opt-in启用 + 优雅降级

5.2 关键教训

教训1:页码不等于语义

位置信息(页码、坐标)只是表象,真正的关联是语义层面的。当系统依赖位置做决策时,考虑是否可以升级为语义匹配。在我们的案例中,升级路径是:

页码匹配 → 关键词匹配 → 向量相似度匹配

我们选择了中间方案(关键词匹配),因为它的成本最低且效果足够好。

教训2:视觉模型和文本模型不是一回事

用文本模型处理图像输入,会返回"不支持图像"的错误。这个错误信息很明确,但我们花了半天才注意到,因为错误被日志淹没了。教训是:

  • 当API调用失败时,先检查模型类型是否匹配
  • 在代码中明确区分 TEXT_MODEL 和 VISION_MODEL
  • 添加早期检查:if "image" in prompt and "vl" not in model: raise ValueError

教训3:结构化输出比自由文本更易用

让模型返回JSON比返回自然语言文本更容易解析和使用。关键是:

  • 在提示词中明确列出所有字段
  • 提供字段值的约束(如 category 必须是枚举值)
  • 使用 parse_llm_json 处理模型可能添加的markdown标记

教训4:上下文窗口要适度

发给视觉模型的上下文文本不是越多越好:

  • 太少(<200字符):模型无法理解图像在文档中的角色
  • 适中(1000-1500字符):模型能准确推断图像与文本的关系
  • 太多(>2000字符):模型"注意力"被分散,分析质量下降

我们的经验值是前后各500字符,总计约1500字符。

教训5:优雅降级是生产系统的必备

语义分析依赖外部API,可能因为各种原因失败(API密钥未配置、网络超时、模型不可用)。系统必须能在这些情况下继续工作,只是质量降低:

ifnot config.api_key:    logger.warning("API key not set, skipping analysis")return [None] * len(images)  # 返回空分析,而不是抛异常

这样用户即使不配置API密钥,系统仍然能用页码匹配生成演示文稿,只是质量不如语义匹配。


6 后续工作

6.1 短期(1-2周)

  1. 缓存策略:实现图像分析结果的持久化缓存(基于图像MD5),避免重复分析同一图像
  2. 错误恢复:增强视觉模型调用的重试机制,处理网络超时和模型限流
  3. 批量优化:对于包含大量图像的PDF,实现分批分析,避免长时间阻塞

6.2 中期(1-2月)

  1. 多语言支持:扩展语义分析支持日文、韩文等CJK语言的图像描述
  2. 向量嵌入:引入向量相似度计算,替代简单的关键词匹配,提升放置准确率
  3. 用户反馈循环:允许用户调整图像位置,将反馈用于优化放置算法

6.3 长期(3-6月)

  1. 自适应学习:基于用户反馈自动调整不同类别图像的放置权重
  2. 知识图谱集成:将图像的关键概念与知识图谱关联,实现更深层次的语义理解
  3. 多模态演示文稿:不仅放置图像,还能生成图像的文字说明,形成图文并茂的幻灯片

附录

A.1 关键代码位置

  • 分析配置packages/pdf-image-extractor/pdf_image_extractor/config.py:97-126 (AnalysisConfig)
  • 图像分析数据类packages/pdf-image-extractor/pdf_image_extractor/extractor.py:77-98 (ImageAnalysis)
  • 并行分析引擎packages/pdf-image-extractor/pdf_image_extractor/extractor.py:591-693 (analyze_images)
  • 语义放置算法packages/ppt-generator/ppt_generator/generator.py:321-365 (_match_image_to_slides)
  • CLI集成packages/pdf-image-extractor/main.py:45-89 (--analyze flag)

A.2 测试方法

# 运行图像分析测试cd packages/pdf-image-extractorpython -m pytest tests/test_integration_analysis.py -v# 运行语义放置测试cd packages/ppt-generatorpython -m pytest tests/test_semantic_image_placement.py -v# 端到端测试export DASHSCOPE_API_KEY="your-key"python packages/pdf-image-extractor/main.py data/chapter04.pdf --analyze --jsonpython packages/ppt-generator/main.py data/chapter04.pdf --use-llm --enable-image-analysis

联系方式: 如有问题或建议,请联系 linmk@tup.tsinghua.edu.cn

项目仓库:back1992/ppt-bot-v2-packages.git


基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-11 18:05:50 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/847052.html
  2. 运行时间 : 0.270484s [ 吞吐率:3.70req/s ] 内存消耗:4,967.13kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=037553c10510dbf28f30e45519fb1afc
  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.000872s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001431s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000659s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000643s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001529s ]
  6. SELECT * FROM `set` [ RunTime:0.000567s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.002087s ]
  8. SELECT * FROM `article` WHERE `id` = 847052 LIMIT 1 [ RunTime:0.001491s ]
  9. UPDATE `article` SET `lasttime` = 1783764350 WHERE `id` = 847052 [ RunTime:0.032814s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000855s ]
  11. SELECT * FROM `article` WHERE `id` < 847052 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001329s ]
  12. SELECT * FROM `article` WHERE `id` > 847052 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001243s ]
  13. SELECT * FROM `article` WHERE `id` < 847052 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002624s ]
  14. SELECT * FROM `article` WHERE `id` < 847052 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.019534s ]
  15. SELECT * FROM `article` WHERE `id` < 847052 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.014369s ]
0.274513s