Как использовать XMLReader / DOMDocument с большим XML-файлом и предотвратить ошибку 500 - PullRequest
0 голосов
/ 26 февраля 2011

У меня есть XML-файл размером примерно 12 МБ, в котором содержится около 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куча товаров для магазина, поэтому два запроса: а) insert ignore сам магазин и б) вставить товар

Любое понимание будет с благодарностью.

Ответы [ 2 ]

17 голосов
/ 16 июня 2011

Почему вы смешиваете 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. В данном примере вы можете обрабатывать XML-файлы с сотнями МБ без увеличения лимита памяти (за исключением того, что текущий тег, который вы пытаетесь прочитать, больше доступной памяти).

1 голос
/ 26 февраля 2011

Возможно, вам не хватает памяти.Попробуйте увеличить предел памяти

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

или любой другой объем памяти, необходимый (это зависит от вашего сервера).Я оставляю здесь некоторые ссылки с другими способами увеличения лимита памяти вашего сервера:

PHP: увеличение лимита памяти

PHP: увеличение лимита памяти 2

...