MigrateDownloadCountsCommand.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php declare(strict_types=1);
  2. namespace Packagist\WebBundle\Command;
  3. use Symfony\Component\Console\Input\InputInterface;
  4. use Symfony\Component\Console\Input\InputOption;
  5. use Symfony\Component\Console\Output\OutputInterface;
  6. use Symfony\Component\Filesystem\LockHandler;
  7. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  8. use Seld\Signal\SignalHandler;
  9. use Packagist\WebBundle\Entity\Package;
  10. class MigrateDownloadCountsCommand extends ContainerAwareCommand
  11. {
  12. protected function configure()
  13. {
  14. $this
  15. ->setName('packagist:migrate-download-counts')
  16. ->setDescription('Migrates download counts from redis to mysql')
  17. ;
  18. }
  19. protected function execute(InputInterface $input, OutputInterface $output)
  20. {
  21. $locker = $this->getContainer()->get('locker');
  22. $logger = $this->getContainer()->get('logger');
  23. // another migrate command is still active
  24. $lockAcquired = $locker->lockCommand($this->getName());
  25. if (!$lockAcquired) {
  26. if ($input->getOption('verbose')) {
  27. $output->writeln('Aborting, another task is running already');
  28. }
  29. return;
  30. }
  31. $signal = SignalHandler::create(null, $logger);
  32. $downloadManager = $this->getContainer()->get('packagist.download_manager');
  33. $doctrine = $this->getContainer()->get('doctrine');
  34. $packageRepo = $doctrine->getRepository(Package::class);
  35. try {
  36. $packagesToProcess = $packageRepo->iterateStaleDownloadCountPackageIds();
  37. foreach ($packagesToProcess as $packageDetails) {
  38. $packageId = $packageDetails['id'];
  39. $logger->debug('Processing package #'.$packageId);
  40. $package = $packageRepo->findOneById($packageId);
  41. $downloadManager->transferDownloadsToDb($package, $packageDetails['lastUpdated']);
  42. $doctrine->getManager()->clear();
  43. if ($signal->isTriggered()) {
  44. break;
  45. }
  46. }
  47. } finally {
  48. $locker->unlockCommand($this->getName());
  49. }
  50. }
  51. }