Laravel — Запускать запланированную задачу, только если завершилась та же самая предыдущая задача

#php #laravel-5

#php #laravel-5

Вопрос:

Мне было интересно, есть ли в Laravel встроенная функция для запуска запланированной задачи только в том случае, если предыдущая завершена.

Мне нужно запускать определенную задачу каждые несколько секунд, но задача зависит от запроса другого хоста, который может в какой-то момент потерять соединение.

Есть несколько способов, которыми я думал об этом, если нет:

  1. Выполнение задачи просто помещает задание в очередь
  2. Сохранение флага (либо в виде файла, либо в базе данных), который устанавливается в начале задачи и снимается в конце.

Просто надеюсь, что в планировщике задач есть что-то встроенное, прежде чем я пойду по любому из этих маршрутов…

Ответ №1:

Нашел ответ в документах : D

https://laravel.com/docs/5.3/scheduling

выдержка:

Предотвращение дублирования задач

По умолчанию запланированные задачи будут выполняться, даже если предыдущий экземпляр задачи все еще запущен. Чтобы предотвратить это, вы можете использовать метод withoutOverlapping:

 $schedule->command('emails:send')->withoutOverlapping();
  

В этом примере emails:send команда Artisan будет выполняться каждую минуту, если она еще не запущена. withoutOverlapping Метод особенно полезен, если у вас есть задачи, которые сильно различаются по времени выполнения, что не позволяет точно предсказать, сколько времени займет данная задача.