Метод onOneServer
Метод onOneServer применяется к объекту события планировщика и гарантирует, что задача будет выполнена только на одном экземпляре приложения в распределённой среде. Это особенно важно, когда несколько серверов обрабатывают задачи планировщика и необходимо избежать конфликтов или дублирования данных. Метод не принимает никаких параметров и возвращает тот же объект события для цепочки вызовов.
Синтаксис
<?php
use Illuminate\Console\Scheduling\Schedule;
$schedule->command($command)
->onOneServer();
?>
Пример
Давайте настроим выполнение команды для отправки отчётов только на одном сервере:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('reports:send')
->daily()
->onOneServer();
}
}
?>
В результате команда reports:send будет запускаться ежедневно, но только на одном сервере из кластера.
Пример
Теперь давайте запланируем фоновую задачу на выполнение каждую минуту с защитой от дублирования:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->job(new ProcessPendingOrders)
->everyMinute()
->onOneServer();
}
}
?>
Результат: задача ProcessPendingOrders будет выполняться каждую минуту только на одном сервере, что предотвращает повторную обработку одних и тех же заказов.
Пример
Рассмотрим более сложный пример с условиями выполнения и защитой от параллельных запусков:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule)
{
$schedule->command('backup:run')
->daily()
->between('23:00', '06:00')
->onOneServer()
->emailOutputTo('admin@example.com');
}
}
?>
Команда backup:run будет выполняться ежедневно в период с 23:00 до 06:00 только на одном сервере, а результат выполнения будет отправлен по электронной почте.
Смотрите также
-
метод
withoutOverlapping,
который предотвращает запуск задачи, если она уже выполняется -
метод
command,
который планирует выполнение консольной команды -
метод
job,
который планирует выполнение фонового задания -
метод
daily,
который настраивает ежедневное выполнение задачи