Подтвердить что ты не робот

Laravel запускает несколько запланированных задач

В настоящее время у меня есть запланированная консольная команда, которая выполняется каждые 5 минут без перекрытия, например:

 $schedule->command('crawler')
             ->everyFiveMinutes()
             ->withoutOverlapping()
             ->sendOutputTo('../_laravel/storage/logs/scheduler-log.txt');

Итак, он отлично работает, но в настоящее время у меня около 220 страниц, которые занимают около 3 часов, и заканчиваются с шагом в 5 минут, потому что я просто заставляю его сканировать 10 страниц за каждый интервал, так как каждая страница занимает примерно 20-30 секунд для обхода из-за различных факторов. Каждая страница - это запись в базе данных. Если в итоге у меня будет 10 000 страниц для обхода, этот метод не будет работать, потому что потребуется больше 24 часов, и каждая страница должна пересканировать один раз в день.

Таким образом, мой поставщик разрешает до 10 одновременных запросов (или более с более высокими планами), так что лучший способ запустить его одновременно? Если я просто дублирую код планировщика, выполняет ли он одну и ту же команду дважды или 10 раз, если я дублирую ее 10 раз? Любые проблемы, которые могут возникнуть?

И тогда мне нужно передать параметры на консоль, такие как 1, 2, 3 и т.д., в которых я мог бы использовать, чтобы определить, какие страницы сканируются? то есть 1 будет 1-10 записей, 2 - следующие 11-20 записей и т.д.

Используя этот StackOverfow ответ, я думаю, что знаю, как его передать, например:

 $schedule->command('crawler --sequence=1')

Но как я могу прочитать этот параметр в классе Command? Является ли это просто регулярной переменной PHP, т.е. $sequence?

4b9b3361

Ответ 1

  • Лучше использовать очередь для обработки заданий
  • в cron, добавьте все задания в очередь
  • Запустите несколько рабочих очередей, которые будут обрабатывать задания параллельно

Совет. Это случилось с нами. Может случиться, что ранее добавленная работа не завершена, но cron снова добавляет ту же задачу в очередь. Поскольку очереди работают последовательно. Чтобы избавиться от ситуации, вы должны в теге базы данных, когда задача завершена в последний раз, поэтому вы знаете, когда выполнять задание (если оно было серьезно задержано).

Ответ 2

Я нашел это в документации, я надеюсь, что это то, что вы ищете:

  • Извлечение ввода

Пока ваша команда выполняется, вам, очевидно, потребуется получить доступ к значения аргументов и параметров, принятые вашим приложением. к сделайте это, вы можете использовать аргументы и методы опций:

  • Получение значения аргумента команды

$value = $this- > argument ('name');

  • Получение всех аргументов

$arguments = $this- > argument();

  • Получение значения команды Опция

$value = $this- > option ('name');

  • Получение всех параметров

$options = $this- > option();

источник