【问题标题】:How to use XMLReader/DOMDocument with large XML file and prevent 500 error如何使用 XMLReader/DOMDocument 处理大型 XML 文件并防止 500 错误
【发布时间】:2011-02-26 18:16:56
【问题描述】:

我有一个大约 12mb 的 XML 文件,其中包含大约 16000 个产品。我需要将其处理成数据库;但是,在大约 6000 行时,它会因 500 错误而死。 我正在使用 Kohana 框架(第 3 版)以防万一。

这是我在控制器中的代码:

$xml = new XMLReader();
$xml->open("path/to/file.xml");

$doc = new DOMDocument;

// Skip ahead to the first <product>
while ($xml->read() && $xml->name !== 'product');

// Loop through <product>'s
while ($xml->name == 'product')
{
   $node = simplexml_import_dom($doc->importNode($xml->expand(), true));
   // 2 queries to database put here
   $xml->next('product');
}

XML 是商店的一堆商品,因此两个查询是 a) insert ignore 商店本身和 b) 插入产品

任何见解将不胜感激。

【问题讨论】:

    标签: php xml domdocument large-files xmlreader


    【解决方案1】:

    为什么要混合使用 XMLReader / DomDocument?只需使用 XMLReader:

    $reader = new XMLReader(); // initialize
    $reader->open( 'file.xml' ); // open file
    do {
        $sxe = simplexml_load_string( $reader->readOuterXml() ); // get current element
        echo $sxe; // echo current element
    }
    while( $reader->next( $this->type ) ); // repeat this for any "product" tag
    

    上面例子的好处是,XMLReader 只会将当前标签读入内存。 DomDocument 读取整个文件 - 这就是您收到错误 500 的原因。使用给定的示例,您可以处理数百 MB 的 XML 文件,而不会增加内存限制(除了您尝试读取的当前标签大于可用内存)。

    【讨论】:

    • +1 用于为潜在问题提供可扩展的解决方案。增加内存限制是不可扩展的,并且会在文件增长时再次导致 500。
    【解决方案2】:

    可能您的内存不足。尝试增加你的内存限制

    ini_set('memory_limit','128M');

    或任何必要的内存量(这取决于您的服务器)。 我在这里给你留下了一些增加服务器内存限制的其他方法的链接:

    PHP: Increase memory limit

    PHP: Increase memory limit 2

    【讨论】:

    • 啊,我没想到。我已经添加了它,现在它运行良好。
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2018-01-31
    相关资源
    最近更新 更多