setName('statuses:update') ->setDescription('Update statuses') ->addArgument('accountId', InputArgument::OPTIONAL, 'Choose account, or make it for all') ; } public function __construct(ModuleManagerInterface $moduleManager, AccountManager $accountManager, ObjectManager $entityManager) { $this->moduleManager = $moduleManager; $this->accountManager = $accountManager; $this->entityManager = $entityManager; parent::__construct(); } /** * {@inheritdoc} */ protected function execute(InputInterface $input, OutputInterface $output) { if (!$this->lock()) { $output->writeln('The command is already running in another process.'); return 0; } $accountId = $input->getArgument('accountId') ? (int) $input->getArgument('accountId') : null; $accountQueryBuilder = $this->accountManager->getActiveQueryBuilder() ->andWhere('account.id > :lastId') ->setMaxResults(static::QUERY_MAX_RESULTS) ; if (null !== $accountId) { $accountQueryBuilder ->andWhere('account.id = :accountId') ->setParameter('accountId', $accountId) ; } $accountQuery = $accountQueryBuilder->getQuery(); $commandResult = 0; $count = 0; $lastId = 0; while (true) { $accountQuery->setParameter('lastId', $lastId); $result = $accountQuery->getResult(); if (empty($result)) { break; } foreach ($result as $account) { $lastId = $account->getId(); try { $count += $this->moduleManager ->setAccount($account) ->updateStatuses() ; } catch (\Exception $e) { $output->writeln( "Failed to update statuses for account {$account->getCrmUrl()}[{$account->getId()}]" ); $output->writeln("Error: {$e->getMessage()}"); $commandResult = 1; } } $this->entityManager->clear(); gc_collect_cycles(); } $output->writeln("{$count} statuses updated."); $this->release(); return $commandResult; } }