Verification: a143cc29221c9be0

Php artisan schedule run dev null 2 1

Введение

В прошлом вы могли создавать запись конфигурации cron для каждой задачи, которую нужно было запланировать на своем сервере. Однако это может быстро стать проблемой, потому что ваше расписание задач не находится в системе управления версиями и вы должны подключаться по SSH для просмотра существующих записей cron или добавления дополнительных записей.

Планировщик команд Laravel предлагает новый подход к управлению запланированными задачами на вашем сервере. Планировщик позволяет вам быстро и выразительно определять расписание команд в самом приложении Laravel. При использовании планировщика на вашем сервере требуется только одна запись cron. Расписание задач определяется в методе schedule файла app/Console/Kernel.php. Для начала работы в методе определен простой пример.

Определение расписаний

Вы можете определить все свои запланированные задачи в методе schedule класса App\Console\Kernel вашего приложения. Для начала рассмотрим пример. В этом примере мы определим замыкание, которое будет вызываться каждый день в полночь. В замыкании мы выполним запрос к базе данных для очистки таблицы:

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Facades\DB;

class Kernel extends ConsoleKernel
{
    
    protected $commands = [
        
    ];

    
    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            DB::table('recent_users')->delete();
        })->daily();
    }
}

В дополнение к планированию с использованием замыканий вы также можете использовать вызываемые объекты. Вызываемые объекты – это простые классы PHP, содержащие метод __invoke:

$schedule->call(new DeleteRecentUsers)->daily();

Если вы хотите просмотреть список ваших запланированных задач и их последующего запуска, то вы можете использовать команду schedule:list Artisan:

php artisan schedule:list

Планирование команд Artisan

В дополнение к планированию с использованием замыканий вы также можете использовать команды Artisan и системные команды. Например, вы можете использовать метод command для планирования команды Artisan, используя имя команды или класс.

При планировании команд Artisan с использованием имени класса команды вы можете передать массив дополнительных аргументов командной строки, которые должны быть переданы команде при ее вызове:

use App\Console\Commands\SendEmailsCommand;

$schedule->command('emails:send Taylor --force')->daily();

$schedule->command(SendEmailsCommand::class, ['Taylor', '--force'])->daily();

Планирование отправки заданий в очереди

Метод job используется для планирования отправки задания в очередь. Этот метод обеспечивает удобный способ планирования таких заданий без использования метода call с замыканием:

use App\Jobs\Heartbeat;

$schedule->job(new Heartbeat)->everyFiveMinutes();

Необязательные второй и третий аргументы могут быть переданы методу job для указания имени очереди и соединения очереди, которые должны использоваться для постановки задания в очередь:

use App\Jobs\Heartbeat;


$schedule->job(new Heartbeat, 'heartbeats', 'sqs')->everyFiveMinutes();

Планирование команд операционной системы

Метод exec используется для передачи команды операционной системе:

$schedule->exec('node /home/forge/script.js')->daily();

Параметры периодичности расписания

Мы уже видели несколько примеров того, как можно настроить задачу на выполнение через определенные промежутки времени. Однако существует гораздо больше параметров планирования, которые можно назначить задаче:

Метод Описание
->cron('* * * * *'); Запустить задачу по расписанию с параметрами cron
->everyMinute(); Запускать задачу ежеминутно
->everyTwoMinutes(); – каждые 2 минуты
->everyThreeMinutes(); – каждые 3 минуты
->everyFourMinutes(); – каждые 4 минуты
->everyFiveMinutes(); – каждые 5 минут
->everyTenMinutes(); – каждые 10 минут
->everyFifteenMinutes(); – каждые 15 минут
->everyThirtyMinutes(); – каждые 30 минут
->hourly(); – каждый час
->hourlyAt(17); – в 17 минут каждого часа
->everyTwoHours(); – каждые 2 часа
->everyThreeHours(); – каждые 3 часа
->everyFourHours(); – каждые 4 часа
->everySixHours(); – каждые 6 часов
->daily(); – каждый день в полночь
->dailyAt('13:00'); – ежедневно в 13:00
->twiceDaily(1, 13); – ежедневно дважды в день: в 1:00 и 13:00
->weekly(); – еженедельно в воскресенье в 00:00
->weeklyOn(1, '8:00'); – еженедельно в понедельник в 8:00
->monthly(); – ежемесячно первого числа в 00:00
->monthlyOn(4, '15:00'); – ежемесячно 4 числа в 15:00
->twiceMonthly(1, 16, '13:00'); – ежемесячно дважды в месяц: 1 и 16 числа в 13:00
->lastDayOfMonth('15:00'); – ежемесячно в последний день месяца в 15:00
->quarterly(); – ежеквартально в первый день в 00:00
->yearly(); – ежегодно в первый день в 00:00
->yearlyOn(6, 1, '17:00'); – ежегодно в июне первого числа в 17:00
->timezone('America/New_York'); Установить часовой пояс для задачи

Эти методы можно комбинировать с дополнительными ограничениями для создания еще более точных расписаний, которые выполняются только в определенные дни недели. Например, вы можете запланировать выполнение команды еженедельно в понедельник:


$schedule->call(function () {
    
})->weekly()->mondays()->at('13:00');


$schedule->command('foo')
          ->weekdays()
          ->hourly()
          ->timezone('America/Chicago')
          ->between('8:00', '17:00');

Список дополнительных ограничений расписания можно найти ниже:

Метод Описание
->weekdays(); Ограничить выполнение задачи рабочими днями
->weekends(); – выходными днями
->sundays(); – воскресным днем
->mondays(); – понедельником
->tuesdays(); – вторником
->wednesdays(); – средой
->thursdays(); – четвергом
->fridays(); – пятницей
->saturdays(); – субботой
->days(array|mixed); – определенными днями
->between($startTime, $endTime); – временными интервалами начала и окончания
->unlessBetween($startTime, $endTime); – через исключение временных интервалов начала и окончания
->when(Closure); – на основе истинности результата выполненного замыкания
->environments($env); – окружением выполнения

Дневные ограничения

Метод days можно использовать для ограничения выполнения задачи определенными днями недели. Например, вы можете запланировать выполнение команды ежечасно по воскресеньям и четвергам:

$schedule->command('emails:send')
                ->hourly()
                ->days([0, 3]);

В качестве альтернативы вы можете использовать константы, доступные в классе Illuminate\Console\Scheduling\Schedule, при указании дней, в которые должна выполняться задача:

use Illuminate\Console\Scheduling\Schedule;

$schedule->command('emails:send')
                ->hourly()
                ->days([Schedule::SUNDAY, Schedule::WEDNESDAY]);

Ограничения с временными интервалами

Метод between может использоваться для ограничения выполнения задачи в зависимости от времени суток:

$schedule->command('emails:send')
                    ->hourly()
                    ->between('7:00', '22:00');

Точно так же метод unlessBetween может использоваться для исключения определенных периодов времени выполнения задачи:

$schedule->command('emails:send')
                    ->hourly()
                    ->unlessBetween('23:00', '4:00');

Условные ограничения

Метод when может использоваться для ограничения выполнения задачи на основе истинности результата выполненного замыкания. Другими словами, если переданное замыкание возвращает true, то задача будет выполняться до тех пор, пока никакие другие ограничивающие условия не препятствуют ее запуску:

$schedule->command('emails:send')->daily()->when(function () {
    return true;
});

Метод skip можно рассматривать как противоположный методу when. Если метод skip возвращает true, то запланированная задача не будет выполнена:

$schedule->command('emails:send')->daily()->skip(function () {
    return true;
});

При использовании цепочки методов when, запланированная команда будет выполняться только в том случае, если все условия when возвращают значение true.

Ограничения окружения выполнения

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

$schedule->command('emails:send')
            ->daily()
            ->environments(['staging', 'production']);

Часовые пояса

Используя метод timezone, вы можете указать, что время запланированной задачи должно интерпретироваться в рамках переданного часового пояса:

$schedule->command('report:generate')
         ->timezone('America/New_York')
         ->at('2:00')

Если вы постоянно назначаете один и тот же часовой пояс для всех запланированных задач, то вы можете определить метод scheduleTimezone в своем классе App\Console\Kernel. Этот метод должен возвращать часовой пояс, назначаемый по умолчанию для всех запланированных задач:


protected function scheduleTimezone()
{
    return 'America/Chicago';
}
Помните, что в некоторых часовых поясах используется летнее время. Когда происходит переход на летнее время, ваша запланированная задача может запускаться дважды или даже не запускаться вообще. По этой причине мы рекомендуем по возможности избегать указаний часовых поясов при планировании.

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

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

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

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

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

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

Выполнение задач на одном сервере

Чтобы использовать этот функционал, ваше приложение должно использовать по умолчанию один из следующих драйверов кеша: database, memcached, dynamodb, или redis. Кроме того, все серверы должны взаимодействовать с одним и тем же центральным сервером кеширования.

Если планировщик вашего приложения работает на нескольких серверах, то вы можете ограничить выполнение запланированного задания только на одном сервере. Например, предположим, что у вас есть запланированная задача, по которой каждую пятницу вечером создается новый отчет. Если планировщик задач работает на трех рабочих серверах, запланированная задача будет запущена на всех трех серверах и трижды сгенерирует отчет. Не очень хорошо!

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

$schedule->command('report:generate')
                ->fridays()
                ->at('17:00')
                ->onOneServer();

Фоновые задачи

По умолчанию, несколько задач, запланированных одновременно, будут выполняться последовательно в соответствии с порядком, которым они определены в вашем методе schedule. Если у вас есть длительные задачи, это может привести к тому, что последующие задачи начнутся намного позже, чем ожидалось. Если вы хотите запускать задачи в фоновом режиме в соответствии с планом, то вы можете использовать метод runInBackground:

$schedule->command('analytics:report')
         ->daily()
         ->runInBackground();
Метод runInBackground может использоваться только при планировании задач с помощью методов command и exec.

Режим технического обслуживания

Запланированные задачи вашего приложения не будут выполняться, когда приложение находится в режиме обслуживания, поскольку мы не хотим, чтобы ваши задачи мешали любому незавершенному процессу обслуживания, выполняющемуся на вашем сервере. Однако, если вы хотите принудительно запустить задачу даже в режиме обслуживания, то используйте метод evenInMaintenanceMode при определении задачи:

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

Запуск планировщика

Теперь, когда мы узнали, как определять планирование задачи, давайте обсудим, как же запускать их на нашем сервере. Команда schedule:run Artisan проанализирует все ваши запланированные задачи и определит, нужно ли их запускать, исходя из текущего времени сервера.

Итак, при использовании планировщика Laravel нам нужно добавить только одну конфигурационную запись cron на наш сервер, которая запускает команду schedule:run каждую минуту. Если вы не знаете, как добавить записи cron на свой сервер, то рассмотрите возможность использования такой службы, как Laravel Forge, которая может управлять записями cron за вас:

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Локальный запуск планировщика

Как правило, на локальной машине нет необходимости в добавлении записи cron планировщика. Вместо этого вы можете использовать команду schedule:work Artisan. Эта команда будет работать на переднем плане и вызывать планировщик каждую минуту, пока вы не завершите команду:

php artisan schedule:work

Результат выполнения задачи

Планировщик Laravel предлагает несколько удобных методов для работы с выводом результатов, созданных запланированными задачами. Во-первых, используя метод sendOutputTo, вы можете отправить результат в файл для последующей просмотра:

$schedule->command('emails:send')
         ->daily()
         ->sendOutputTo($filePath);

Если вы хотите добавить результат в указанный файл, то используйте метод appendOutputTo:

$schedule->command('emails:send')
         ->daily()
         ->appendOutputTo($filePath);

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

$schedule->command('report:generate')
         ->daily()
         ->sendOutputTo($filePath)
         ->emailOutputTo('taylor@example.com');

Если вы хотите отправить результат по электронной почте только в том случае, если запланированная (Artisan или системная) команда завершается ненулевым кодом возврата, используйте метод emailOutputOnFailure:

$schedule->command('report:generate')
         ->daily()
         ->emailOutputOnFailure('taylor@example.com');
Методы emailOutputTo, emailOutputOnFailure, sendOutputTo, and appendOutputTo могут использоваться только при планировании задач с помощью методов command и exec.

Введение

В прошлом вы могли создавать запись Cron для каждой задачи, которую нужно было запланировать на своем сервере. Однако это может быстро стать проблемой, потому что ваше расписание задач больше не находится в системе контроля версий, и вы должны подключиться к серверу по SSH, чтобы добавить дополнительные записи Cron.

Планировщик команд Laravel позволяет вам плавно и выразительно определять расписание команд в самом Laravel. При использовании планировщика на вашем сервере требуется только одна запись Cron. Расписание ваших задач определяется в методе schedule файла app/Console/Kernel.php. Чтобы помочь вам начать работу, в методе определен простой пример.

Запуск Планировщика

При использовании планировщика вам нужно только добавить следующую запись Cron на свой сервер. Если вы не знаете, как добавить записи Cron на свой сервер, рассмотрите возможность использования такой службы, как Laravel Forge , которая может управлять записями Cron за вас:

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Этот Cron будет вызывать планировщик команд Laravel каждую минуту. Когда выполняется команда schedule:run, Laravel оценивает ваши запланированные задачи и запускает задачи, которые должны быть выполнены.

Определение расписаний

Вы можете определить все свои запланированные задачи в методе schedule класса App\Console\Kernel. Для начала рассмотрим пример планирования задачи. В этом примере мы запланируем, что Closure будет вызываться каждый день в полночь. В Closure мы выполним запрос к базе данных, чтобы очистить таблицу:

call(function () {
            DB::table('recent_users')->delete();
        })->daily();
    }
}

В дополнение к планированию с использованием замыканий вы также можете использовать вызываемые объекты . Вызываемые объекты - это простые классы PHP, содержащие метод __invoke:

$schedule->call(new DeleteRecentUsers)->daily();

Планирование команд Artisan

В дополнение к планированию вызовов закрытия, вы также можете запланировать Artisan-команды и команды операционной системы. Например, вы можете использовать метод command для планирования команды Artisan, используя имя команды или класс:

$schedule->command('emails:send Taylor --force')->daily();

$schedule->command(EmailsCommand::class, ['Taylor', '--force'])->daily();

Планирование заданий в очереди

Метод job может использоваться для планирования задания в очереди . Этот метод обеспечивает удобный способ планирования заданий без использования метода call для ручного создания замыканий для постановки задания в очередь:

$schedule->job(new Heartbeat)->everyFiveMinutes();

// Dispatch the job to the "heartbeats" queue...
$schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes();

Планирование команд оболочки

Метод exec может использоваться для выдачи команды операционной системе:

$schedule->exec('node /home/forge/script.js')->daily();

Параметры частоты расписания

Есть множество расписаний, которые вы можете назначить для своей задачи:

Метод Описание
->cron(' * * * '); Запускать задачу по индивидуальному расписанию Cron
->everyMinute(); Запускать задачу каждую минуту
->everyTwoMinutes(); Запускать задачу каждые две минуты
->everyThreeMinutes(); Запускать задачу каждые три минуты
->everyFourMinutes(); Запускать задачу каждые четыре минуты
->everyFiveMinutes(); Запускать задачу каждые пять минут
->everyTenMinutes(); Запускать задачу каждые десять минут
->everyFifteenMinutes(); Запускать задачу каждые пятнадцать минут
->everyThirtyMinutes(); Запускать задачу каждые тридцать минут
->hourly(); Запускать задачу каждый час
->hourlyAt(17); Запускать задачу каждый час через 17 минут после часа
->everyTwoHours(); Запускать задачу каждые два часа
->everyThreeHours(); Запускать задачу каждые три часа
->everyFourHours(); Запускать задачу каждые четыре часа
->everySixHours(); Запускать задачу каждые шесть часов
->daily(); Выполнять задачу каждый день в полночь
->dailyAt('13:00'); Запускать задачу каждый день в 13:00
->twiceDaily(1, 13); Запускать задачу ежедневно в 1:00 & 13:00
->weekly(); Запускать задачу каждое воскресенье в 00:00
->weeklyOn(1, '8:00'); Запускать задачу каждую неделю в понедельник в 8:00
->monthly(); Запускать задачу первого числа каждого месяца в 00:00
->monthlyOn(4, '15:00'); Выполнять задачу каждый месяц 4 числа в 15:00
->lastDayOfMonth('15:00'); Запускать задачу в последний день месяца в 15:00
->quarterly(); Выполнять задачу в первый день каждого квартала в 00:00
->yearly(); Запускать задачу в первый день каждого года в 00:00
->timezone('America/New_York'); Установите часовой пояс

Эти методы могут быть объединены с дополнительными ограничениями для создания еще более точно настроенных расписаний, которые выполняются только в определенные дни недели. Например, чтобы запланировать выполнение команды еженедельно в понедельник:

// Run once per week on Monday at 1 PM...
$schedule->call(function () {
    //
})->weekly()->mondays()->at('13:00');

// Run hourly from 8 AM to 5 PM on weekdays...
$schedule->command('foo')
          ->weekdays()
          ->hourly()
          ->timezone('America/Chicago')
          ->between('8:00', '17:00');

Ниже приводится список дополнительных ограничений расписания:

Метод Описание
->weekdays(); Ограничьте задачу рабочими днями
->weekends(); Ограничьте задачу выходными
->sundays(); Ограничьте задачу воскресеньем
->mondays(); Ограничьте задачу понедельником
->tuesdays(); Ограничьте задачу вторником
->wednesdays(); Ограничьте задачу средой
->thursdays(); Ограничьте задачу до четверга
->fridays(); Ограничьте задачу пятницей
->saturdays(); Ограничьте задачу субботой
->days(array|mixed); Ограничьте задачу определенными днями
->between($start, $end); Ограничьте выполнение задачи между временем начала и окончания
->when(Closure); Ограничьте задачу на основе проверки истинности
->environments($env); Ограничьте задачу определенной средой

Дневные ограничения

Метод days может использоваться для ограничения выполнения задачи определенными днями недели. Например, вы можете запланировать выполнение команды ежечасно по воскресеньям и средам:

$schedule->command('reminders:send')
                ->hourly()
                ->days([0, 3]);

Между временными ограничениями

Метод between может использоваться для ограничения выполнения задачи в зависимости от времени суток:

$schedule->command('reminders:send')
                    ->hourly()
                    ->between('7:00', '22:00');

Аналогично, метод unlessBetween может использоваться для исключения выполнения задачи на определенный период времени:

$schedule->command('reminders:send')
                    ->hourly()
                    ->unlessBetween('23:00', '4:00');

Ограничения проверки правды

Метод when может использоваться для ограничения выполнения задачи на основе результата данного теста истинности. Другими словами, если данный Closure возвращает true, задача будет выполняться до тех пор, пока никакие другие ограничивающие условия не препятствуют ее запуску:

$schedule->command('emails:send')->daily()->when(function () {
    return true;
});

Метод skip можно рассматривать как обратный when. Если метод skip возвращает true, запланированная задача не будет выполнена:

$schedule->command('emails:send')->daily()->skip(function () {
    return true;
});

При использовании связанных методов when запланированная команда будет выполняться только в том случае, если все when условия возвращают true.

Ограничения среды

Метод environments может использоваться для выполнения задач только в указанных средах:

$schedule->command('emails:send')
            ->daily()
            ->environments(['staging', 'production']);

Часовые пояса

Используя метод timezone, вы можете указать, что время запланированной задачи должно интерпретироваться в пределах данного часового пояса:

$schedule->command('report:generate')
         ->timezone('America/New_York')
         ->at('02:00')

Если вы назначаете один и тот же часовой пояс для всех запланированных задач, вы можете определить метод scheduleTimezone в своем файле app/Console/Kernel.php. Этот метод должен возвращать часовой пояс по умолчанию, который должен быть назначен для всех запланированных задач:

/**
 * Get the timezone that should be used by default for scheduled events.
 *
 * @return \DateTimeZone|string|null
 */
protected function scheduleTimezone()
{
    return 'America/Chicago';
}

{note} Помните, что в некоторых часовых поясах используется летнее время. Когда происходит переход на летнее время, ваша запланированная задача может запускаться дважды или даже не запускаться вообще. По этой причине мы рекомендуем по возможности избегать планирования часовых поясов.

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

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

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

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

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

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

Выполнение задач на одном сервере

{note} Чтобы использовать эту функцию, ваше приложение должно использовать драйвер кэша database, memcached или redis в качестве драйвера кэша по умолчанию для вашего приложения. Кроме того, все серверы должны взаимодействовать с одним и тем же центральным сервером кэширования.

Если ваше приложение выполняется на нескольких серверах, вы можете ограничить выполнение запланированного задания только на одном сервере. Например, предположим, что у вас есть запланированная задача, которая создает новый отчет каждую пятницу вечером. Если планировщик задач работает на трех рабочих серверах, запланированная задача будет запущена на всех трех серверах и трижды сгенерирует отчет. Не хорошо!

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

$schedule->command('report:generate')
                ->fridays()
                ->at('17:00')
                ->onOneServer();

Справочные задачи

По умолчанию несколько запланированных одновременно команд будут выполняться последовательно. Если у вас есть длительные команды, это может привести к тому, что последующие команды будут запускаться намного позже, чем ожидалось. Если вы хотите запускать команды в фоновом режиме, чтобы все они могли выполняться одновременно, вы можете использовать метод runInBackground:

$schedule->command('analytics:report')
         ->daily()
         ->runInBackground();

{note} Метод runInBackground можно использовать только при планировании задач с помощью методов command и exec.

Режим обслуживания

Запланированные задачи Laravel не будут выполняться, когда Laravel находится в режиме обслуживания , поскольку мы не хотим, чтобы ваши задачи мешали любому незавершенному обслуживанию, которое вы можете выполнять на своем сервере. Однако, если вы хотите принудительно запустить задачу даже в режиме обслуживания, вы можете использовать метод evenInMaintenanceMode:

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

Результат задания

Планировщик Laravel предоставляет несколько удобных методов для работы с выводом, созданным запланированными задачами. Во-первых, используя метод sendOutputTo, вы можете отправить вывод в файл для последующей проверки:

$schedule->command('emails:send')
         ->daily()
         ->sendOutputTo($filePath);

Если вы хотите добавить вывод в данный файл, вы можете использовать метод appendOutputTo:

$schedule->command('emails:send')
         ->daily()
         ->appendOutputTo($filePath);

Используя метод emailOutputTo, вы можете отправить вывод по электронной почте на адрес электронной почты по вашему выбору. Перед отправкой по электронной почте вывода задачи вы должны настроить Laravel почтовые службы :

$schedule->command('foo')
         ->daily()
         ->sendOutputTo($filePath)
         ->emailOutputTo('taylor@example.com');

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

$schedule->command('foo')
         ->daily()
         ->emailOutputOnFailure('dayle@example.com');

{note} Методы emailOutputTo, emailOutputOnFailure, sendOutputTo и appendOutputTo являются исключительными для методов command и exec.