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