PHP foreach при обработке кусков

В настоящее время я пытаюсь обрабатывать большой XML-файл (1,5 ГБ), в настоящее время он открывается в кусках

$handle = fopen($url, "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $chunk = fgets($handle, 4096); // echo each chunk echo $chunk; } fclose($handle); } 

Вместо эхо-ответа на этот фрагмент я бы хотел сохранить каждую строку до тех пор, пока не будет найден </file> . для этого:

 $handle = fopen($url, "r") or die("Couldn't get handle"); if ($handle) { while (!feof($handle)) { $chunk = fgets($handle, 4096); // echo '<xmp>'.$buffer.'</xmp>'; if (strpos($fullstring,'</file>') !== false) { // i should have everything between <file> and </file> // empty the $fullstring so it can fill with chunks again $fullstring = ''; } else { $fullstring .= $chunk; } } fclose($handle); } 

Теперь я хотел бы запустить это в цикле foreach. Но вместо того, чтобы зацикливать каждый найденный, он устанавливает один и тот же <file></file> для всех найденных <file></file> .

Как я могу обработать каждый <file>content</file> найденный при загрузке файла в куски?

Заранее спасибо!

Если вам нужно проанализировать большой XML-файл, я предлагаю объединить XMLReader с DOM. Используйте XMLReader, чтобы получить узел элемента chunk, развернуть его в DOM и использовать Xpath для извлечения деталей из куска.

 $reader = new XMLReader; $reader->open($file); $dom = new DOMDocument; $xpath = new DOMXpath($dom); // look for the first chunk while ($reader->read() && $reader->localName !== 'file') { continue; } // while you have an file element while ($reader->localName === 'file') { $node = $reader->expand($dom); // $xpath->evaluate('expression', $node); // ... // move to the next chunk (next file sibling node) $reader->next('file'); } 

Я бы рекомендовал методы DomDocument PHP. Это полезно для анализа XML или HTML-документов, которые вы можете получить с помощью дескриптора файла или file_get_contents и т. Д.

http://php.net/manual/en/class.domdocument.php

Кроме того, PHP имеет возможность array_chunk http://php.net/manual/en/function.array-chunk.php