簡體   English   中英

在PHP中驗證大型XML文件~400MB

[英]Validating a large XML file ~400MB in PHP

我有一個大的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)都會導致一些對我來說是“新鮮殺手”的東西,在看起來像是30秒之后終止腳本。

我想我可能需要增加腳本的內存,以便在處理60MB時計算出峰值使用量,並相應調整大小,並且還會關閉腳本時間限制以防萬一。

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

不幸的是,這不起作用,因為如果內存負載(即使是正確的術語?)一直很高,那么oom殺手似乎是一個linux的東西。

如果我能以某種方式加載xml,這將是很好的,因為我想這將減少內存負載,以便oom殺手不會堅持它的肥胖鼻子並殺死我的過程。

有沒有人有任何驗證大型XML文件和捕獲錯誤形成錯誤的經驗,我讀過很多帖子都指向可能解決我問題的SAX和XMLReader。

更新所以@chiborg幾乎為我解決了這個問題...這個方法唯一的缺點就是我沒有看到文件中的所有錯誤,只是第一個失敗,我認為這是有意義的,因為我認為它無法解析失敗的第一個點。

當使用simplexml時...它能夠捕獲文件中的大部分問題並在最后向我展示這很好。

由於SimpleXML和DOM API將始終將文檔加載到內存中,因此使用SAX或XMLReader等流式解析器是更好的方法。

通過示例頁面中的代碼,它可能如下所示:

$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);

對於大文件,完美使用XMLReader類。

但是如果喜歡simplexml語法: https//github.com/dkrnl/SimpleXMLReader/blob/master/library/SimpleXMLReader.php用法示例: http//github.com/dkrnl/SimpleXMLReader/blob/master/examples/example1 。 PHP

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM