PHP 批量文档提取空批次调用:Xberg `extractBatch([])` 的行为解析与实战验证
后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载导读在 Xberg 的 PHP 绑定中Xberg::extractBatch()提供了一次性批量提取多个文档的能力当传入的输入数组为空时它的行为值得明确返回一个合法的批处理结果对象results为空数组而不是抛出异常。本文围绕这一空批次场景结合仓库中的 fixture 断言、PHP E2E 测试与 Rust 底层实现说明空批次调用的语义、验证方式与实战注意事项。从一个自动生成的代码片段说起仓库中docs-site/src/snippets-generated/php/batch/extract_batch_empty_inputs.md是一段由 alef 自动生成的 PHP 示例其核心内容如下?php declare(strict_types1); require_once __DIR__ . /vendor/autoload.php; use Xberg\Xberg; use Xberg\ExtractionConfig; $result Xberg::extractBatch([], \Xberg\ExtractionConfig::from_json({})); var_dump($result-getResults());这段代码做了三件事通过 Composer 的vendor/autoload.php加载 PHP 绑定以空数组[]作为输入列表调用Xberg::extractBatch()配置参数直接以空 JSON{}构造ExtractionConfig用var_dump($result-getResults())输出结果。从代码可以看出extractBatch的第一个参数是输入数组可以是ExtractInput实例的列表第二个参数是提取配置。空数组意味着本次批量任务没有任何待处理文档。空批次调用的语义合法输入返回空结果核心结论不是错误而是空结果空批次并不是非法调用。仓库中的测试夹具fixtures/batch/empty_inputs.json明确给出了这一场景的契约定义{ id: extract_batch_empty_inputs, category: batch, description: extract_batch: empty batch, call: extract_batch, input: { inputs: [] }, assertions: [ { type: not_error }, { type: count_equals, value: 0, field: results } ] }夹具中有两条关键断言not_error本次调用不应返回错误count_equalsvalue 为 0field 为results返回结果的results字段数量必须等于0。也就是说空批次是一个被明确支持的合法边界场景其返回值是一个正常的批量结果对象只是没有任何提取结果条目。对应 PHP E2E 测试与文档片段对应的 E2E 测试位于e2e/php/tests/BatchTest.php/** extract_batch: empty batch */ public function test_extract_batch_empty_inputs(): void { $result XbergApi::extractBatch([], \Xberg\ExtractionConfig::from_json({})); $results $result-getResults(); $this-assertCount(0, $results); }测试验证了与文档片段完全一致的结论extractBatch([], ...)返回的对象非空但其getResults()返回的数组长度为 0。注意这里的入口是XbergApi::extractBatch测试用的 API 风格而 snippets 中展示的是Xberg::extractBatch——两者属于同一批量提取 API 的不同调用入口行为一致。理解批量提取 APIextractBatch的输入与输出常规输入形态在日常使用中extractBatch的第一个参数是一个ExtractInput列表。ExtractInput支持两种主要来源可混合使用这在packages/php/README.md的Processing Multiple Files示例中有完整展示$inputs [ ExtractInput::fromUri(document1.pdf), ExtractInput::fromUri(document2.docx), ExtractInput::fromBytes(file_get_contents(note.txt) ?: , text/plain, note.txt), ];fromUri()以 URI 方式引用本地文件或远程文档fromBytes()直接以字节内容构造输入需显式给出 MIME 类型。输出的三个层次调用后返回的结果对象通常可以通过以下方式读取getResults()提取成功的结果数组每个元素包含content文本内容、tables表格、mimeType等字段summary-results与summary-errors汇总统计分别表示成功与失败的条目数批量场景下结果数组的元素顺序与输入顺序保持一致便于一一对应。在空批次场景下getResults()返回[]summary-results为 0summary-errors也为 0。空批次与失败批次的边界对比为了更准确地理解空批次语义可以和 E2E 测试中其他边界场景对照均位于e2e/php/tests/BatchTest.php场景输入期望行为空批次[]无错误results为 0assertCount(0, ...)URI 全部缺失两个不存在的 URIsummary-results 0summary-errors 2单个 URI 缺失一个不存在的 URIsummary-results 0summary-errors 1部分失败一个有效 一个损坏文件summary-results 1summary-errors 1关键区别在于空批次是没有任务因此既没有结果也没有错误全部失败/部分失败是有任务但未成功此时结果与错误通过summary分别计数且不会因为个别条目失败而中断整个批次。这一设计意味着extractBatch天然具备容错与逐条目隔离的特性即使输入列表中存在无法解析的文档也不会影响其他文档的提取。文档片段所示空数组直接调用的合法性正是这一容错语义在零输入时的自然延伸。底层实现Rust 侧的extract_batchPHP 绑定背后是统一的 Rust 核心。批量提取的 CLI 入口实现在crates/xberg-cli/src/commands/extract/batch.rs其核心调用通过crates/xberg-cli/src/commands/extract/runtime.rs中的block_on_extract_batch完成pub(super) fn block_on_extract_batch( // inputs 与 config 参数… ) { // … .block_on(extract_batch(inputs, config)) }从源码结构看extract_batch接收inputs与config两个参数与 PHP 侧extractBatch($inputs, $config)一一对应对输入列表进行批量调度空输入时循环体不执行任何提取直接返回空的结果集合并继续走统一的成功路径——这与 fixture 中not_errorcount_equals 0的断言完全吻合。实战建议何时会出现空批次在真实业务中输入列表为空通常来自上游数据源的动态性例如从数据库/队列拉取待处理文档时本次周期内没有任何新增文件用户在前端未选择任何文件就提交了批量处理请求分页遍历目录时某一次迭代恰好没有匹配文件。调用方的防御性写法即使空批次是合法行为仍建议在调用前做一次快速短路判断避免无意义的调度开销$inputs collectPendingDocuments(); // 可能为空 if ($inputs []) { echo No documents to process\n; return; } $result Xberg::extractBatch($inputs, new ExtractionConfig( extractTables: true, extractImages: false, )); echo Processed {$result-summary-results} documents\n;结果遍历的健壮性基于空批次返回空 results的契约调用方可以放心地对getResults()做foreach遍历而无需判空同时借助summary-errors可以区分没有输入与输入全部失败两种语义从而在日志与告警中给出准确的业务提示。相关资源本文依据的自动生成片段docs-site/src/snippets-generated/php/batch/extract_batch_empty_inputs.md批次契约定义含空批次断言fixtures/batch/empty_inputs.jsonPHP E2E 批次测试e2e/php/tests/BatchTest.phpPHP 包使用指南批量提取示例packages/php/README.mdRust 底层批量提取实现crates/xberg-cli/src/commands/extract/batch.rs与crates/xberg-cli/src/commands/extract/runtime.rs赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐用 PHP 批量提取内存文档Xberg extractBatch 实战指南用 PHP 批量提取内存文档Xberg extractBatch 实战指南 导读 本文围绕 xberg 仓库中 PHP 绑定提供的 Xberg::extrac后端AI 应用NLPXberg Dart 批量提取实战用 extractBatch 一次性解析多个内存文档Xberg Dart 批量提取实战用 extractBatch 一次性解析多个内存文档 导读 本文围绕 Xberg 项目 Dart 语言绑定中的 extrac后端AI 应用NLP使用 AWS CLI 的 cognito-idp admin-create-user 创建 Cognito 用户池用户命令、参数与输出解析使用 AWS CLI 的 cognito idp admin create user 创建 Cognito 用户池用户命令、参数与输出解析 导读 admin后端AI 应用NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

校园网IPv6过渡技术实践:双栈、隧道与NAT-PT模拟实验指南

校园网IPv6过渡技术实践:双栈、隧道与NAT-PT模拟实验指南

简介:IPv4地址枯竭推动网络协议向IPv6演进,双栈、隧道与协议转换是平滑过渡的三大核心技术。双栈让设备同时运行IPv4/IPv6协议栈,隧道将IPv6报文封装在IPv4网络中传递,NAT-PT则实现纯IPv6与IPv4主机的互访。基于Dynamips模拟器可复…

2026/10/9 8:32:20 阅读更多 →
Python量化交易入门:从零实现双均线回测策略

Python量化交易入门:从零实现双均线回测策略

很多朋友学了 Python 基础语法之后,最常问的一个问题就是:“我学的这些东西到底能用来干什么?” 其实有个特别适合练手、又极其真实的应用方向,就是量化交易。用 Python 拉取历史行情、写策略逻辑、跑一遍历史回测,看着…

2026/10/9 8:32:20 阅读更多 →
Spring Boot高校科研管理系统设计与实现:从数据库到部署全解析

Spring Boot高校科研管理系统设计与实现:从数据库到部署全解析

最近帮某高校实验室把一套基于 Spring Boot 的高校科研管理系统从零搭了起来,包含源码、数据库脚本和配套文档,前后花了两周多。这类系统其实在很多高校内部都有痛点:项目申报靠 Excel 传来传去、经费报销对不上账、成果统计全靠科研秘书手工…

2026/10/9 8:32:20 阅读更多 →

最新新闻

pstack-claude:VS Code 本地 Claude 调试网关与可观测性实践

pstack-claude:VS Code 本地 Claude 调试网关与可观测性实践

1. 项目概述:pstack-claude 是什么,它解决的到底是什么问题? pstack-claude 这个名字乍看像一个工具组合名,但拆开来看,“pstack”是 Linux 系统中一个真实存在的诊断命令,用于打印运行中进程的调用栈&…

2026/10/9 9:00:37 阅读更多 →
多Agent协作下的统一触达层设计:Agent-Reach路由与熔断实践

多Agent协作下的统一触达层设计:Agent-Reach路由与熔断实践

前几个月我在搞一个多Agent协作系统,Agent数量一多,问题就变得特别现实:意图识别要调NLU服务,工具调用要连一堆第三方接口,记忆模块要读向量库,还要对接几个大模型供应商。每个服务各连各的,配置…

2026/10/9 9:00:37 阅读更多 →
vSphere 5实战价值:老旧系统兼容、教学实训与安全审计的不可替代平台

vSphere 5实战价值:老旧系统兼容、教学实训与安全审计的不可替代平台

1. 为什么今天还要学vSphere 5?——一个被低估的“老”平台实战价值很多人看到“vSphere 5”四个字,第一反应是:这都2024年了,ESXi 5.5早在2015年就结束主流支持,连VMware官方补丁都停了,还花时间学它&…

2026/10/9 9:00:37 阅读更多 →
网页版YOLO训练平台:从需求拆解到工程落地全记录

网页版YOLO训练平台:从需求拆解到工程落地全记录

最近我把 YOLO 训练从冷冰冰的命令行搬到了网页上。说实话,这个想法憋了大半年,真正动手是在某个赶项目的深夜——看着同事在终端里敲着一长串python train.py参数,改完 batch size 又忘了改 data 路径,那一瞬间我意识到&#xff…

2026/10/9 9:00:37 阅读更多 →
Flask搭建设计课程自主学习系统后端:从数据库设计到部署实战

Flask搭建设计课程自主学习系统后端:从数据库设计到部署实战

做这个系统其实是个偶然。当时朋友所在的设计培训机构需要一套给学员用的自主学习平台,要求能放图文课程、记录学习进度、支持学员提交作品,还要让老师能看出谁真正学完了。前前后后对比了一圈现成方案,要么太重,要么不好改&#…

2026/10/9 9:00:37 阅读更多 →
Java毕业设计:智慧招聘管理平台完整实现与答辩指南

Java毕业设计:智慧招聘管理平台完整实现与答辩指南

每年到毕业设计季,“Java毕业设计选什么题”都是私信里被问烂的问题。如果你翻过各种毕设题目清单,会发现“在线招聘平台”“人才服务系统”这类题从来没缺过,但大部分作品都停留在“登录注册CRUD一个表格页面”的程度,答辩时老师…

2026/10/9 8:59:34 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →