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?

2 ответов


  1. лучше использовать очередь для обработки заданий
  2. в cron добавьте все задания в очередь
  3. запустите несколько работников очереди, которые будут обрабатывать задания параллельно

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


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

  • Получение Входных Данных

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

  • Получение Значения Аргумента Команды

$value = $this - > аргумент ('name');

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

$ arguments = $this - >argument ();

  • Получение Значения Команды Вариант

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

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

$options = $this - >option ();

источник