nodeType == \XmlReader::END_ELEMENT) { $this->closeElement($reader->localName); } while ($reader->read()) { switch ($reader->nodeType) { case \XMLReader::ELEMENT: $this->currentPath[] = $reader->localName; if ($reader->localName === $this::SECTION_ITEM) { return 1; } break; case \XMLReader::END_ELEMENT: $this->closeElement($reader->localName); break; } } return 0; } private function closeElement($elementName) { while ($this->currentPath && array_pop($this->currentPath) !== $elementName) ; } private function getItemFieldsArray(\XmlReader $reader) { $attrs = []; while($reader->read() && !$this->isItemEnd($reader)) { switch ($reader->nodeType) { case XMLReader::END_ELEMENT: continue; break; case XMLReader::ELEMENT: $attrs[$reader->name] = $reader->isEmptyElement ? '' : $this->getItemFieldsArray($reader); break; case XMLReader::TEXT: case XMLReader::CDATA: return $reader->value; } } return $attrs; } private function isItemEnd(\XmlReader $reader) { return $reader->nodeType == \XmlReader::END_ELEMENT && $reader->localName === 'item'; } private function getElements(\XmlReader $reader, ModelBuilder $builder) { $newElementsCount = 0; $count = 0; $model = $builder->getModel($data = $this->getItemFieldsArray($reader)); assert('$model instanceof ImportRecord'); $isNew = $model->getIsNewRecord(); if ($model instanceof ZipalNewbuildingItemNew) { if ($model->save()) { if ($isNew) { ++$newElementsCount; } ++$count; } else { echo 'Cannt save model!'; } } return [$newElementsCount, $count]; } public function load() { $reader = new \XmlReader(); $reader->open('https://zipal.ru/import/buildings.xml'); $startTime = time(); try { $builder = new ZipalNewbuildingItemBuilderNew(); while ($sectionId = $this->getNextSection($reader)) { if ($sectionId != 1) { continue; } $this->getElements($reader, $builder); } $wastedTime = time() - $startTime; echo $wastedTime; } catch (\Exception $e) { var_dump($e); } finally { $reader->close(); } } }