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

У меня есть 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 представляет собой набор элементов для хранилища, поэтому два запроса: a) insert ignore сам магазин и b) вставляет продукт

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

Вероятно, у вас заканчивается память. Попытайтесь увеличить лимит памяти

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

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

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

PHP: Увеличьте ограничение памяти 2

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