2011-02-26 9 views
0

我有一个大约12mb的XML文件,其中大约有16000个产品。我需要将它处理成一个数据库;然而,在大约6000行时,它会以500错误而死亡。 我正在使用Kohana框架(版本3),以防万一与它有任何关系。如何在大型XML文件中使用XMLReader/DOMDocument并防止500错误

这里是我的代码,我有控制器内部:

$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是AA一堆物品的商店,所以这两个查询是一个)insert ignore商店本身和b)插入产品

任何有识之士将不胜感激。

回答

1

可能您的内存不足。尽量增加你的内存限制

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

或任何的内存量是neccesary(这取决于你的服务器上)。 我离开你这里随你的服务器的内存限制的其他方式的一些链接:

PHP: Increase memory limit

PHP: Increase memory limit 2

+0

啊,我没有想到这一点。我已经添加了,现在它运行良好。 – 2011-02-26 18:32:28

17

你为什么混合的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

+1为潜在问题提供可扩展的解决方案。增加的内存限制是不可扩展的,并且在文件增长时将再次导致500。 – xbonez 2012-04-02 11:54:23

相关问题