작업 예약
ㅋㅋ > 스케줄링
- 셸 명령 스케줄링
- 스케줄링 빈도 설정
- 시간 범위 제한
- 환경 제약
- 시간대
- 작업 중복 방지
- 작업은 하나의 서버에서만 실행됩니다.
- 백그라운드 작업
- Ping URL
작업 예약
소개
과거에는 서버의 각 예약된 작업에 대해 Cron 항목을 만들어야 할 수도 있었습니다. 그러나 이러한 작업 스케줄러는 소스 코드에 없고 Cron 항목을 추가하려면 매번 SSH 링크를 통해 서버에 로그인해야 하기 때문에 이 접근 방식은 금세 불편해집니다.
Laravel 명령줄 스케줄러를 사용하면 Laravel에서 명령 스케줄링을 명확하고 원활하게 정의할 수 있습니다. 그리고 이 작업 스케줄러를 사용할 때 서버에 단일 Cron 항목 인터페이스만 생성하면 됩니다. 작업 일정은
app/Console/Kernel.php
의schedule
메서드에 정의되어 있습니다. 시작하는 데 도움이 되도록 이 방법에 대한 간단한 예를 소개합니다.app/Console/Kernel.php
的schedule
方法中进行定义。为了帮助你更好的入门,这个方法中有个简单的例子。启动调度器
当使用这个调度器时,你只需要把下面的 Cron 入口添加到你的服务器中即可。如果你不知道怎么在服务器中添加 Cron 入口,可以考虑使用一些服务来管理 Cron 入口,比如 Laravel Forge:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
这个 Cron 为每分钟执行一次 Laravel 的命令行调度器。当
schedule:run
命令被执行的时候,Laravel 会根据你的调度执行预定的程序。定义调度
你可以在
AppConsoleKernel
类的schedule
스케줄러 시작
이 스케줄러를 사용하는 경우 서버에 다음 Cron 항목만 추가하면 됩니다. Cron 항목을 서버에 추가하는 방법을 모르는 경우 Laravel Forge:
<?php namespace App\Console; use Illuminate\Support\Facades\DB; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel{ /** * 应用里的自定义 Artisan 命令 * * @var array */ protected $commands = [ // ]; /** * 定义计划任务 * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); } }
이 Cron은 1분마다 Laravel을 실행하는 명령줄 스케줄러입니다.schedule:run
명령이 실행되면 Laravel은 일정에 따라 예약된 프로그램을 실행합니다.일정 정의🎜🎜AppConsoleKernel
클래스에서 이 작업을 수행할 수 있습니다. 모든 일정 작업은 >schedule 메소드에 정의됩니다. 시작하기 전에 예를 살펴보겠습니다. 이 예에서는 매일 자정에 클로저를 호출할 계획입니다. 클로저에서는 데이터베이스 쿼리를 실행하여 테이블을 지웁니다. 🎜$schedule->call(new DeleteRecentUsers)->daily();
🎜클로저를 사용하여 작업 일정을 정의하는 것 외에도 🎜invokable 개체🎜를 사용할 수도 있습니다. 🎜$schedule->command('emails:send --force')->daily(); $schedule->command(EmailsCommand::class, ['--force'])->daily();
🎜🎜🎜🎜🎜🎜Artisan 명령 스케줄링
클로저를 호출하여 스케줄링하는 것 외에도 Artisan 명령 및 운영 체제 명령을 호출할 수도 있습니다. 예를 들어, 명령 이름이나 클래스를
command
메소드에 전달하여 Artisan 명령을 전달할 수 있습니다.command
方法传递命令名称或者类来调度一个 Artisan 命令。$schedule->job(new Heartbeat)->everyFiveMinutes(); // 分发任务到「heartbeats」队列... $schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes();
队列任务调度
job
方法可以用来调度 队列任务。此方法提供了一种快捷的方式来调度任务,而无需使用call
方法创建闭包来调度任务。$schedule->exec('node /home/forge/script.js')->daily();
Shell 命令调度
exec
// 每周一 13:00 执行... $schedule->call(function () { // })->weekly()->mondays()->at('13:00'); // 工作日(周一至周五) 8点 至 17 点每小时执行一次... $schedule->command('foo') ->weekdays() ->hourly() ->timezone('America/Chicago') ->between('8:00', '17:00');
큐 작업 예약job
방법은 다음과 같습니다. 대기열 작업을 예약하는 데 사용됩니다. 이 방법은 작업을 예약하기 위해call
메서드를 사용하여 클로저를 생성하지 않고도 작업을 예약하는 빠른 방법을 제공합니다. 🎜$schedule->command('reminders:send') ->hourly() ->between('7:00', '22:00');
🎜🎜🎜🎜🎜Shell 명령 예약🎜🎜exec
방법은 다음과 같습니다. 사용 운영 체제에 명령 보내기: 🎜$schedule->command('reminders:send') ->hourly() ->unlessBetween('23:00', '4:00');
🎜🎜🎜🎜🎜🎜일정 빈도 설정
물론 작업에 여러 일정 계획을 할당할 수 있습니다.
🎜 매월 4일 15시에 작업 실행🎜🎜🎜🎜Method Description ->cron('* * * * *');
->cron('* * * * *');
自定义 Cron 时间表执行任务 ->everyMinute();
每分钟执行一次任务 ->everyFiveMinutes();
每五分钟执行一次任务 ->everyTenMinutes();
每十分钟执行一次任务 ->everyFifteenMinutes();
每十五分钟执行一次任务 ->everyThirtyMinutes();
每三十分钟执行一次任务 ->hourly();
每小时执行一次任务 ->hourlyAt(17);
每小时第 17 分钟执行一次任务 ->daily();
每天午夜执行一次任务(译者注:每天零点) ->dailyAt('13:00');
每天 13 点执行一次任务 ->twiceDaily(1, 13);
每天 1 点 和 13 点分别执行一次任务 ->weekly();
每周执行一次任务 🎜 맞춤형 Cron 일정 실행 작업->weeklyOn(1, '8:00');
- >everyMinute();
🎜🎜1분마다 작업 실행🎜🎜🎜🎜->everyFiveMinutes();
🎜🎜5분마다 작업 실행🎜🎜🎜🎜< code> ->everyTenMinutes();🎜🎜10분마다 작업 실행🎜🎜🎜🎜->everyFifteenMinutes();
🎜🎜15분마다 작업 실행🎜🎜 🎜🎜< code>->everyThirtyMinutes();🎜🎜30분마다 작업 실행🎜🎜🎜🎜->hourly();
🎜🎜1시간마다 작업 실행 🎜🎜🎜🎜->hourlyAt(17);
🎜🎜매시간 17분에 작업을 실행합니다🎜🎜🎜🎜->daily();
🎜🎜매일 자정에 작업 (번역자 주: 매일 0시)🎜🎜🎜🎜->dailyAt('13:00');
🎜🎜매일 13시에 작업을 실행🎜🎜 🎜🎜->twiceDaily(1, 13);
🎜🎜매일 1:00과 13:00에 한 번씩 작업을 실행합니다🎜🎜🎜🎜->weekly(); code>🎜🎜일주일에 한 번 실행 Task🎜🎜🎜🎜
->weeklyOn(1, '8:00');
🎜🎜매주 월요일 8시에 태스크 실행🎜🎜->monthly();
->monthly();
每月执行一次任务 ->monthlyOn(4, '15:00');
每月 4 号的 15 点执行一次任务 ->quarterly();
每季度执行一次任务 ->yearly();
每年执行一次任务 한 달에 한 번 작업을 실행합니다->timezone('America/New_York');
->monthlyOn(4, '15:00');
->분기별();
🎜🎜분기마다 작업 실행🎜🎜🎜🎜->연간 ();< /code>🎜🎜1년에 한 번 작업을 실행합니다🎜🎜🎜🎜
🎜🎜목요일에 작업을 실행하도록 제한🎜🎜🎜🎜->timezone('America/New_York');
🎜🎜시간대 설정🎜🎜🎜🎜다른 특정 조건과 결합하여 주중 특정 시간에 실행되는 작업을 생성할 수 있습니다. 예를 들어 월요일마다 명령을 실행하려면 다음과 같습니다.
$schedule->command('emails:send')->daily()->when(function () { return true; });
추가 제약 조건 목록은 다음과 같습니다.
🎜주말에 실행할 작업을 제한🎜🎜🎜🎜Method Description ->weekdays();
->weekdays();
限制任务在工作日执行 ->weekends();
限制任务在周末执行 ->sundays();
限制任务在周日执行 ->mondays();
限制任务在周一执行 ->tuesdays();
限制任务在周二执行 ->wednesdays();
限制任务在周三执行 ->thursdays();
限制任务在周四执行 ->fridays();
限制任务在周五执行 ->saturdays();
限制任务在周六执行 ->between($start, $end);
限制任务在 $start
和$end
之间执行->when(Closure);
当闭包返回为真时执行 평일에 실행할 작업을 제한->environments($env);
->weekends();
->sundays() ;
🎜🎜일요일에 실행되는 작업을 제한🎜🎜🎜🎜->mondays();
🎜🎜월요일에 실행되는 작업을 제한🎜🎜🎜🎜-> ;tuesdays();
🎜🎜화요일에 실행할 작업을 제한🎜🎜🎜🎜->wednesdays();
🎜🎜수요일에 실행할 작업을 제한🎜🎜🎜🎜< code>->thursdays();->fridays();
🎜🎜금요일에 작업을 실행하도록 제한🎜 🎜🎜🎜->saturdays();< /code>🎜🎜작업을 토요일에 실행하도록 제한🎜🎜🎜🎜
사이에 실행되는 작업을 제한합니다. 🎜🎜🎜🎜->between($start, $end);
🎜 🎜$start
및 < code>$end->when(Closure);
🎜🎜Executed 사이에 실행됩니다. 클로저가 true를 반환하는 경우🎜🎜🎜🎜-> 환경($env);
🎜🎜특정 환경에서 실행되는 작업을 제한합니다🎜🎜🎜🎜시간 범위 제한
작업을 하루 중 특정 기간으로 제한하려면
between
을 사용하세요.between
来限制任务在一天中的某个时间段来执行:$schedule->command('emails:send')->daily()->skip(function () { return true; });
或者使用
unlessBetween
方法来为任务排除一个时间段:$schedule->command('emails:send') ->daily() ->environments(['staging', 'production']);
闭包测试限制
使用
when
方法来根据测试结果来执行任务。也就是说,如果给定的闭包返回结果为true
,只要没有其他约束条件阻止任务运行,任务就会一直执行下去:$schedule->command('report:generate') ->timezone('America/New_York') ->at('02:00')
skip
方法可以看做是when
方法的逆过程。如果skip
方法返回true
,任务就不会执行:/** * 获取默认情况下应为预定事件使用的时区。 * * @return \DateTimeZone|string|null */ protected function scheduleTimezone(){ return 'America/Chicago'; }
使用链式调用
when
方法时,只有所有的when
都返回true
时,任务才会执行。环境约束
environments
方法可用于仅在给定环境中执行任务:$schedule->command('emails:send')->withoutOverlapping();
时区
使用
timezone
方法,你可以指定任务在给定的时区内执行:$schedule->command('emails:send')->withoutOverlapping(10);
如果要为所有计划任务分配相同的时区,则可能希望在
app/Console/Kernel.php
文件中定义scheduleTimezone
方法。 此方法应返回应分配给所有计划任务的默认时区:$schedule->command('report:generate') ->fridays() ->at('17:00') ->onOneServer();
{note} 请记住,有些时区会使用夏令时。当夏时制时间发生更改时,你的任务可能会执行两次,甚至根本不会执行。所以我们建议尽可能避免使用时区来安排计划任务。
避免任务重复
默认情况下,即使之前的任务还在执行,调度内任务也会执行。你可以使用
withoutOverlapping
方法来避免这种情况:$schedule->command('analytics:report') ->daily() ->runInBackground();
在这个例子中,如果
emails:send
Artisan 命令 没有正在运行,它将会每分钟执行一次。如果你的任务执行时间不确定,且你又不能准确预估出任务的执行时间,那么withoutOverlapping
$schedule->command('emails:send')->evenInMaintenanceMode();
또는 작업을 제외하려면unlessBetween
메서드를 사용하세요. 기간:$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);
클로저 테스트 제한테스트 결과에 따라 작업을 수행하려면
when
메서드를 사용하세요. 즉, 주어진 클로저가true
를 반환하면 작업 실행을 방해하는 다른 제약 조건이 없는 한 작업은 계속 실행됩니다.$schedule->command('emails:send') ->daily() ->appendOutputTo($filePath);
skip
메소드when
메소드의 역과정으로 볼 수 있습니다.skip
메서드가true
를 반환하면 작업이 실행되지 않습니다.$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');
🎜체인에서when
메서드를 호출하면 모든 < code> 둘 다true
를 반환하면 작업이 실행됩니다. 🎜🎜🎜Environment Constraints🎜🎜environments
메소드는 주어진 환경에서만 작업을 수행하는 데 사용할 수 있습니다: 🎜$schedule->command('emails:send') ->daily() ->before(function () { // Task is about to start... }) ->after(function () { // Task is complete... });
🎜🎜🎜🎜Timezone
🎜timezone
방법을 사용하면 작업이 다음과 같이 지정될 수 있습니다. 지정된 시간대에서 실행 범위: 🎜$schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url);
🎜 예약된 모든 작업에 동일한 시간대를 할당하려면app/Console/Kernel에서
파일. 이 메소드는 모든 예약된 작업에 할당되어야 하는 기본 시간대를 반환해야 합니다. 🎜scheduleTimezone
메서드를 정의할 수 있습니다. .php$schedule->command('emails:send') ->daily() ->pingBeforeIf($condition, $url) ->thenPingIf($condition, $url);
🎜{note} 일부 시간대에서는 일광 절약 시간을 사용한다는 점을 명심하세요. 일광 절약 시간제가 변경되면 작업이 두 번 실행되거나 전혀 실행되지 않을 수 있습니다. 따라서 가능하면 시간대를 사용하여 예약된 작업을 예약하지 않는 것이 좋습니다. 🎜
🎜🎜🎜🎜작업 중복 방지
🎜기본적으로 , 이전 작업이 계속 실행 중이더라도 예약된 작업이 실행됩니다.withoutOverlapping
방법을 사용하면 이를 방지할 수 있습니다: 🎜composer require guzzlehttp/guzzle
🎜이 예에서emails:send
Artisan 명령이 실행되고 있지 않으면 1분마다 실행됩니다.withoutOverlapping
메서드는 작업 실행 시간이 불확실하고 작업 실행 시간을 정확하게 예측할 수 없는 경우 특히 유용합니다. 🎜🎜필요한 경우 "겹침 없음"을 지정하여 지정된 시간 범위를 잠글 수 있습니다. 기본적으로 잠금은 24시간 후에 만료됩니다. 🎜rrreee🎜🎜🎜🎜🎜🎜작업은 하나의 서버에서만 실행됩니다
{note} 이 기능을 사용하려면 애플리케이션의 기본 캐시 드라이버가
memcached
또는redis
여야 합니다. 또한 모든 서버는 동일한 중앙 캐시 서버를 사용하여 통신해야 합니다.memcached
或者redis
。除此之外,所有的服务器必须使用同一个中央缓存服务器通信。如果你的应用在多个服务器上运行,你可能需要限制你的调度任务只在单个服务器上运行。假设你有一个调度任务:每周五晚生成一份新报告。如果这个任务调度器在三个服务器上运行,那么这个任务会在三台服务器上运行且生成三份报告。这样不好!
为了说明任务应该在单个服务器上运行,在定义调度任务时使用
rrreeeonOneServer
方法。第一个获取到任务的服务器会生成一个原子锁,用来防止其他服务器在同一时刻执行相同任务。后台任务
默认情况下,同时调度的多个命令将按顺序执行。如果你有长时间运行的命令,这可能会导致后续命令的启动时间比预期的要晚。因此,你想在后台同时运行命令,可以使用
rrreeerunInBackground
方法:维护模式
Laravel 的队列任务在 维护模式 下不会运行。因为我们不想你的调度任务干扰到你服务器上可能还未完成的项目。不过,如果你确实是想在维护模式下强制调度任务执行,你可以使用
rrreeeevenInMaintenanceMode
方法:任务输出
Laravel 调度器提供了一些方便的方法来处理调度任务输出。首先,你可以使用
rrreeesendOutputTo
方法来输出到文件以便于后续检查:如果希望将输出
rrreee附加
到给定文件,可以使用appendOutputTo
方法使用
rrreeeemailOutputTo
方法,你可以将输出发送到指定邮箱。在使用邮件发送之前,你需要配置 Laravel 的 邮件服务:{note}
emailOutputTo
,sendOutputTo
和appendOutputTo
方法是command
和exec
独有的。任务钩子
使用
애플리케이션이 여러 서버에서 실행되는 경우 예약된 작업을 단일 서버에서만 실행하도록 제한할 수 있습니다. 매주 금요일 밤에 새 보고서를 생성하는 일정이 있다고 가정해 보겠습니다. 작업 스케줄러가 세 개의 서버에서 실행되는 경우 작업은 세 개의 서버에서 실행되고 세 개의 보고서를 생성합니다. 이건 좋지 않아! 작업이 단일 서버에서 실행되어야 함을 나타내려면 예약된 작업을 정의할 때before
和after
onOneServer
메서드를 사용하세요. 작업을 획득한 첫 번째 서버는 다른 서버가 동시에 동일한 작업을 실행하지 못하도록 원자 잠금을 생성합니다. 🎜rrreee🎜🎜🎜🎜백그라운드 작업🎜🎜기본적으로 동시에 예약된 여러 명령은 순서대로 실행됩니다. . 장기 실행 명령이 있는 경우 이로 인해 후속 명령이 예상보다 늦게 시작될 수 있습니다. 따라서 동시에 백그라운드에서 명령을 실행하려면runInBackground
메서드를 사용할 수 있습니다: 🎜rrreee🎜🎜🎜🎜유지 관리 모드🎜🎜Laravel의 대기열 작업은 유지 관리 모드에서 실행되지 않습니다. 귀하의 예약 작업이 귀하의 서버에서 완료되지 않을 수 있는 프로젝트를 방해하는 것을 원하지 않기 때문입니다. 그러나 유지 관리 모드에서 예약된 작업을 강제로 실행하려면evenInMaintenanceMode
메서드를 사용할 수 있습니다. 🎜rrreee🎜🎜🎜작업 출력
🎜Laravel 스케줄러는 예약된 작업 출력을 처리하는 몇 가지 편리한 방법을 제공합니다. 먼저sendOutputTo
메서드를 사용하여 나중에 검사할 수 있도록 파일로 출력할 수 있습니다. 🎜rrreee🎜 출력을 특정 파일에추가
하려면를 사용하세요. code>appendOutputTo
메소드 🎜rrreee🎜emailOutputTo
메소드를 사용하면 지정된 메일박스로 출력을 보낼 수 있습니다. 이메일을 사용하여 보내기 전에 Laravel의 이메일 서비스를 구성해야 합니다: 🎜rrreee🎜🎜{note}emailOutputTo
,sendOutputTo
및appendOutputTo
메소드는 다음과 같습니다. < code>command 및exec
에만 고유합니다. 🎜🎜🎜🎜웹사이트에 처음 게재되었습니다. 🎜🎜작업 후크
🎜before
및after
메서드를 사용하면 예약된 작업이 실행되기 전이나 후에 특정 코드를 실행할 수 있습니다. 🎜rrreee🎜🎜Ping URL
rrreeepingBefore
및thenPing
메서드를 사용하면 작업 실행 전후에 지정된 URL을 ping할 수 있습니다. 이 방법은 외부 서비스(예: Laravel EnvoyerpingBefore
和thenPing
方法,你可以在任务执行前或者执行后来 ping 指定的 URL。这个方法在通知外部服务(比如 Laravel Envoyer)时将会特别有用:只有在给定条件为
rrreeetrue
时,才能使用pingBeforeIf
和thenPingIf
)에 알릴 때 특히 유용합니다.주어진 경우에만 조건이
rrreeetrue
인 경우pingBeforeIf
및thenPingIf
메서드를 사용하여 지정된 URL을 핑할 수 있습니다.모든 핑 방법에는 Guzzle HTTP가 필요합니다. 도서관. Composer를 사용하여 프로젝트에 Guzzle을 추가할 수 있습니다. rrreee이 기사는LearnKu.com← 대기줄