在 PHP 中验证约 400MB 的大型 XML 文件

2024-05-12

我有一个很大的 XML 文件(大约 400MB),在开始处理之前我需要确保它的格式正确。

我尝试的第一件事是类似于下面的内容,这很棒,因为我可以找出 XML 是否格式不正确以及 XML 的哪些部分“不好”

$doc = simplexml_load_string($xmlstr);
if (!$doc) {
    $errors = libxml_get_errors();

    foreach ($errors as $error) {
        echo display_xml_error($error);
    }

    libxml_clear_errors();
}

也尝试过...

$doc->load( $tempFileName, LIBXML_DTDLOAD|LIBXML_DTDVALID )

我用大约 60MB 的文件对此进行了测试,但是任何更大的文件(~400MB)都会导致一些对我来说新的“oom Killer”启动并在看起来总是 30 秒后终止脚本。

我认为我可能需要增加脚本上的内存,因此计算出处理 60MB 时的峰值使用量,并相应地调整为大容量,并关闭脚本时间限制,以防万一。

set_time_limit(0);
ini_set('memory_limit', '512M');

不幸的是,这不起作用,因为 oom Killer 似乎是一个 Linux 东西,如果内存负载(即使是正确的术语?)始终很高,它就会启动。

如果我能以某种方式加载 xml 就太好了,因为我想这会减少内存负载,这样 oom Killer 就不会插入它的肥鼻子并杀死我的进程。

有没有人有验证大型 XML 文件并捕获其格式错误的错误的经验,我读过的很多帖子都指出 SAX 和 XMLReader 可能会解决我的问题。

UPDATE所以@chiborg几乎为我解决了这个问题...这种方法的唯一缺点是我看不到文件中的所有错误,只有第一个失败的错误,我认为这是有道理的,因为我认为它无法解析超过第一个失败点。

当使用 simplexml 时...它能够捕获文件中的大部分问题并在最后向我展示这很好。


由于 SimpleXML 和 DOM API 始终将文档加载到内存中,因此使用 SAX 或 XMLReader 等流式解析器是更好的方法。

调整代码示例页面 http://php.net/manual/de/example.xml-structure.php,它可能看起来像这样:

$xml_parser = xml_parser_create();
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        $errors[] = array(
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser));
    }
}
xml_parser_free($xml_parser);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 中验证约 400MB 的大型 XML 文件 的相关文章

  • Doctrine 模型的默认排序属性

    我想知道是否有办法声明我的学说模型的默认顺序 e g 我有一个work模型并且它有photos 当我加载作品时 与其关联的所有照片都会加载到 work gt photos 当我显示它们时 它们是按 ID 排序的 在另一个字段上声明默认顺序或
  • 将变量从 PHP 发送到 Javascript

    我在两个单独的文件中有以下代码 其中一个是 javascript 另一个是 php JavaScript xmlhttp new XMLHttpRequest xmlhttp onreadystatechange function if t
  • laravel/lumen-installer 安装失败:guzzlehttp/guzzle 锁定在 6.3.0

    我正在尝试通过命令安装 Lumencomposer global require laravel lumen installer 但在终端上抛出以下错误 Changed current directory to home lykos con
  • 如何仅从 XML 生成 JAXB 类

    我需要从不提供架构的 xml 生成类 我知道这几乎没有用 但事实是我们有 xml 它是结构化的 我们应该能够从 xml 创建模型 过去我都是手工完成的 但是当前我正在使用的 xml 文档非常大 我的时间可能会更好地花在构建满足我需要的东西上
  • 合并2个XML文件并修改属性值

    我有两个 xml 文件 我想将它们合并并用一些属性进行一些算术 请提供一些想法 我正在使用标准 xslthttp informatik hu berlin de merge http informatik hu berlin de merg
  • 如何在函数内部使用 require_once [重复]

    这个问题在这里已经有答案了 你好 我想在函数内使用 require once 但不起作用 实际上我的页面中有三个函数我该怎么做 它在外面工作但不在函数内部 请问有谁吗 这是我的代码
  • cURL 错误 (35):错误:14077458:SSL 例程:SSL23_GET_SERVER_HELLO:tlsv1 无法识别的名称

    我一直在使用以下代码块使用 cURL 从 HTTPS 网站收集数据 q https www example org for example ch curl init curl setopt ch CURLOPT URL q curl set
  • 从 MySQL 返回结果时的数字顺序

    我的数据库表中有以下类型的标题 Topic 1 blah blah Topic 2 blah blah Topic 3 blah blah Topic 10 blah blah Topic 11 blah blah etc 选择查询将始终返
  • 如何在 PHP Soap 客户端中禁用命名空间别名?

    我的 PHP Microsoft AX 集成有问题 我正在使用 SOAP WSDL 与服务集成 我遇到的问题是在从 PHP 向 WSDL 发送请求后收到此错误 无效的实例类型名称 ns3 AxdEntity DirParty DirOrga
  • 在 PHP 中读取“分块”POST 数据

    我试图在发送时使用 Transfer Encoding chunked 从请求中读取 POST 数据 但在收到所有数据之前无法启动脚本 是否可以让 PHP能够在分块请求通过时对其做出反应吗 将 PHP 5 3 8 与 Apache 结合使用
  • 使用 AJAX 来回发送信息

    使用 post 你可以向服务器发送信息 但是当你需要从服务器接收信息时怎么办呢 信息如何从可以由 php 变量保存的方式变为可以由 javascript 变量保存的方式 反之亦然 这与您的问题更相关 http docs jquery com
  • 将行分组在一列上并与其他列形成嵌套子数组

    这是我试图处理的事情 我的数组看起来像这样并且有重复项 products product name gt Adidas1 address gt street 2 product name gt Adidas2 address gt stre
  • 交响乐 2 |修改具有文件(图片)字段的对象时出现表单异常

    我正在使用 Symfony2 我有一个实体Post有标题和图片字段 我的问题 当我创建帖子时一切都很好 我有我的图片等 但是当我想修改它时 我遇到了 图片 字段的问题 它是一个上传的文件 Symfony 想要一个文件类型并且它有一个字符串
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • 如何使用多个Auth组件?

    我使用用户模型将身份验证组件配置为 管理页面 但现在 我还想为客户端创建 配置身份验证 我尝试 重写 inialize This is in my ClientsController php public function initiali
  • 更新 xampp 中的 ICU 扩展吗?

    我在跑xampp我需要升级ICU php intl 扩展 到最新版本 我下载了54从 ICU 页面 但不确定如何升级它 有一个bin include and lib文件夹 我应该把这些文件放在哪里 我还需要做其他事情吗 要升级 XAMP 安
  • 重复密码在 Yii2 中不起作用

    我在模型中编写的规则如下 public password repeat inheritdoc public function rules return password required password string min gt 6 p
  • MySql 西班牙语字符数据

    我有一个包含西班牙语字符的数据库 为了填充数据库 我从字符编码 UTF 8 的客户端页面获取值 当我在 mySql 数据库中插入值时 行包含更改的数据 例如 如果我插入 M xico 数据库中的条目是 M xico 其影响是当我对指定 M
  • 需要从我的应用程序将文件上传到谷歌文档并存储对上传文件的引用

    我正在开发一个基于谷歌应用程序的基本系统 就像我之前定义的那样 我正在构建一个简单的订购系统 并且对于每个下订单 我都会附加一个文件或文档 我希望能够设置它 以便我上传的任何文件都会上传到谷歌文档中 并且我能够以某种方式从我自己的应用程序维
  • 单个返回语句与多个返回语句? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐