我有一个很大的 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 时...它能够捕获文件中的大部分问题并在最后向我展示这很好。