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 ответов
- лучше использовать очередь для обработки заданий
- в cron добавьте все задания в очередь
- запустите несколько работников очереди, которые будут обрабатывать задания параллельно
совет: это произошло с нами. Может случиться так, что задание, добавленное ранее, не завершено, но cron снова добавляет ту же задачу в очередь. Как очереди последовательно. Чтобы спасти себя от ситуации, вы должны в базе данных отметить, когда задача выполнена в последний раз, чтобы вы знали, когда выполнить задание (если оно было серьезно отложено)
Я нашел это в документации, надеюсь, это то, что вы ищете:
- Получение Входных Данных
пока ваша команда выполняется, Вам, очевидно, нужно будет получить доступ к значения аргументов и параметров, принятых приложением. К сделайте это, вы можете использовать методы аргумента и опции:
- Получение Значения Аргумента Команды
$value = $this - > аргумент ('name');
- Получение Всех Аргументов
$ arguments = $this - >argument ();
- Получение Значения Команды Вариант
$value = $this - > option ('name');
- Получение Всех Вариантов
$options = $this - >option ();