Дві проблеми: наступний запуск того самого завдання стартує, поки попереднє ще працює, і довге завдання затримує інші, заплановані на ту саму хвилину.
Накладання - withoutOverlapping():
Schedule::command('import:products')
->everyFiveMinutes()
->withoutOverlapping(30); // блокування на 30 хв на випадок аварії
Поки попередній запуск триває, новий пропускається. Блокування живе в кеші: якщо процес упав, воно спаде за вказаний час (за замовчуванням - 24 години, тож розумний ліміт варто задати).
Затримка інших - runInBackground():
Schedule::command('analytics:report')->daily()->runInBackground();
Завдання на той самий час виконуються послідовно; фонове не змушує наступні чекати. Працює для command() і exec().
Кращий шлях для важкого - щоб планувальник лише ставив роботу в чергу:
Schedule::job(new ImportProducts)->everyFiveMinutes();
Тоді планувальник звільняється миттєво, а повтори, таймаути й паралельність бере на себе черга (ShouldBeUnique проти дублів).
На кількох серверах до цього додається onOneServer() - зі спільним кешем.