본문 바로가기
Laravel

작업 스케줄링 정리

by Sein_ 2023. 10. 8.
728x90

작업 스케줄링하는 방법

작업 일정은 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