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

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

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

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

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

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

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

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

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

10

Решение

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

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

7

Другие решения

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

  • Получение ввода

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

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

$ value = $ this-> аргумент (‘имя’);

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

$ arguments = $ this-> arguments ();

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

$ value = $ this-> option (‘name’);

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

$ options = $ this-> option ();

источник

1

По вопросам рекламы [email protected]