/** * Runs the import */ public function run(Feed $feed) { $this->startTime = microtime(true); while ($item = $this->getNextItem($feed)) { // increase item count $this->processed++; // dispatch event for next item $event = new ItemEvent($this, $item); $this->eventDispatcher->dispatch(ImportEvents::ITEM_START, $event); // import the item try { $source = $this->handler->handle($this->import->getFeed(), $item); $this->successItem($item, $source); } catch (FailedItemException $e) { $this->failItem($item, $e->getMessage()); } // item done $this->eventDispatcher->dispatch(ImportEvents::ITEM_FINISH, $event); // clear entitymanager after batch if ($this->processed % $this->batchSize === 0) { $this->flush(); $this->clear(); } } // flush remaining changes $this->flush(); $this->clear(); $this->logger->finishImportLog($this->import); $this->logger->logImportResult($this); }
/** * @param Import $import * * @throws \RuntimeException * * @return boolean */ public function finishImport(Import $import) { if (!$this->isImportStarted($import)) { throw new \RuntimeException('Import has not yet started'); } if ($this->importHasUnfinishedParts($import)) { throw new \RuntimeException('Cannot close import until all parts have finished'); } $this->logger->getLogger()->debug(sprintf('Finishing import %d as all %d parts have been finished', $import->getId(), $import->getParts()->count())); // set number of errored parts $erroredParts = $import->getParts()->filter(function (ImportPart $part) { return $part->getError(); })->count(); $import->setNumberOfErroredParts($erroredParts); // set end-date/time $import->setDatetimeEnded(new \DateTime()); // flush the end result, and finish the log $this->getEntityManager()->flush($import); $this->logger->finishImportLog($import); // if there are parts with errors, remove the import resources if ($this->importHasErrors($import)) { $this->logger->getLogger()->debug('Removing feed resources as the import contained errors'); try { $reader = $this->createImportReader($import, new EventDispatcher(), $this->getReaderOptions($import)); $this->removeResources($reader->getResources()); } catch (ReadException $e) { // ignore read errors } } $this->eventDispatcher->dispatch(ImportEvents::IMPORT_FINISH, new ImportEvent($import)); }