ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PHP 批量文档提取空批次调用:Xberg `extractBatch([])` 的行为解析与实战验证

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),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进