작업 스케줄링하는 방법
작업 일정은 app/Console/Kernel.php 파일의 schedule 메소드에 정의되어 있습니다.
클로저, command, __invoke 메서드가 포함된 간단한 php 클래스를 사용하여 스케줄링할 수 있습니다.
# 예시
use App\Console\Commands\SendEmailsCommand;
...
protected function schedule(Schedule $schedule)
{
#클로저
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
#__invoke 메서드가 포함된 클래스
$schedule->call(new DeleteRecentUsers)->daily();
#command
$schedule->command('emails:send Taylor --force')->daily();
#커멘드가 호출될 때 인수를 배열로 전달
$schedule->command(SendEmailsCommand::class, ['Taylor', '--force'])->daily();
}
- 스케줄링 주기 관련 옵션
->everyMinute(); | 매분 마다 작업 실행 |
->everyTwoMinutes(); (Two, Three, Ten, ..) | 2분마다 작업 실행 |
->hourly(); | 1시간 간격으로 작업 실행 |
->hourlyAt(17); | 매시간 17분에 실행 |
->everyOddHour(); | 홀수 시간마다 작업 실행 |
->everyTwoHours(); (Two, Three, Four, ..) | 2시간마다 작업 실행 |
->daily(); | 한밤중을 기준으로 하루에 한번 작업 실행 |
->dailyAt('13:00'); | 매일 13:00에 작업 실행 |
->twiceDaily(1, 13); | 하루중 1:00 & 13:00 에 작업 실행(총2번) |
->timezone('America/New_York'); | 타임존 지정 |
이외 weekly, monthly, quarterly, yearly, 요일 제한 등..
- 시간 제한
하루중에 시간에 따라 실행 시간을 제한하기 위해 사용합니다.
->between('7:00', '22:00'); | 7:00 - 22:00 사이에 작업 실행 |
해당 기간 동안의 작업 실행을 제외하는데 사용될 수 있습니다.
->unlessBetween('23:00', '4:00'); | 23:00 - 4:00 사이를 제외하고 작업 실행 |
- 작업 중복 방지
스케줄에 등록된 작업들은 동일한 작업이 이미 실행되고 있어도(작업중) 다시 실행될 것입니다.
이런 중복 실행을 방지하기 위해 withoutOverlapping 메서드를 사용할 수 있습니다.
#매 1분마다 실행하되 중복되지 않게 실행
$schedule->command('emails:send')->withoutOverlapping();
- 백그라운드에서 작업
메인 작업의 흐름에 방해를 주지 않고 비동기적으로 실행되도록 작업하려면 runInBackground 메서드를 사용할 수 있습니다.
*주의: command와 exec 메소드를 통해 작업을 스케쥴 할 때만 사용 가능합니다.
$schedule->command('analytics:report')
->daily()
->runInBackground();
- 스케줄러 실행하기
1. 서버에서 실행
Laravel 스케줄러를 서버에서 실행하는 과정
Laravel 스케줄러는 내부적으로 Unix 시스템의 cron을 사용합니다.
그러므로 서버에서 이 스케줄러를 동작시키려면 cron job을 설정해야 합니다.
서버에서 Cron Job 추가하기:
1) crontab을 편집하기 위해 터미널(bash 쉘)을 열고 `crontab -e` 명령어를 입력합니다.
2) 에디터가 열리면 위에서 언급한 cron job 명령어를 추가합니다.
- 아래 명령어는 매 분마다 Laravel의 스케줄러를 실행하도록 설정된 것입니다.
- 실제로 스케줄링된 태스크가 실행되는 것은 Kernel에 정의된 스케줄링 설정에 따라 결정됩니다.
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
3) 저장하고 에디터를 닫습니다.
이제 Laravel 스케줄러가 설정된 cron job에 의해 주기적으로 실행됩니다.
실제 프로덕션 환경에서는 스케줄링된 태스크의 로그 기록, 에러 핸들링 등 추가적인 설정이 필요할 수 있습니다.
2. 로컬에서 실행
일반적으로 로컬 개발 시스템에 스케줄러 cron 항목을 추가하지 않습니다.
php artisan schedule:work
이 명령은 foreground 에서 실행되고 명령을 종료할 때까지 매분 스케줄러를 호출합니다.
실제로 스케줄링된 태스크가 실행되는 것은 Kernel에 정의된 스케줄링 설정에 따라 결정됩니다.
- 스케줄링 목록 확인
스케줄링된 작업 목록을 보려면 schedule:list 명령을 실행하면 됩니다.
php artisan schedule:list
- 이외
스케줄링 작업 결과를 메일 혹은 파일로 받거나(작업 출력) 작업이 성공하거나 실패한 경우 실행할 코드를 지정(작업 후킹)할 수 있습니다.
그건 라라벨 코리아 사이트에서 확인 :)
https://laravel.kr/docs/9.x/scheduling
라라벨 9.x - 작업 스케줄링
라라벨 한글 메뉴얼 9.x - 작업 스케줄링
laravel.kr
'Laravel' 카테고리의 다른 글
*PHP v8.1 Enum 사용시 (0) | 2023.11.08 |
---|---|
*라라벨 페이지네이션 (커스텀) - LengthAwarePaginator (0) | 2023.11.05 |
Artisan 콘솔(console) 로 실행 가능한 '사용자 명령' (0) | 2023.10.08 |
config 파일 내 변수정의 기준 (0) | 2023.09.30 |
Eloquent ORM - Lazy/Eager Loading (0) | 2023.09.26 |