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