개발일기

Laravel - Schedule 예약 작업 실행 본문

프로그래밍 언어/PHP - Laravel

Laravel - Schedule 예약 작업 실행

Flashback 2022. 8. 13. 16:47
728x90
반응형

기존에 예약 작업을 실행하기 위해서는 SSH 터미널에 크론을 생성한 후, 예약 작업을 설정하였다. 하지만 라라벨에서는 이 예약 작업 부분을 소스 코드에서 관리할 수 있는 Take Schedule이라는 기능이 존재한다.

app\Console\Kernel.php 파일에 코드를 입력하여 예약 작업을 실행시킬 수 있도록 편리한 기능을 제공한다.

 

1. Kernel.php 파일에 예약 작업 추가

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

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

    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function() {
            // 실행할 작업들 생성
        })->daily();
    }

    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

$schedule->call 함수 안에 작업할 내용들을 나열하면 된다. 예를 들어 TestController에 있는 testCron이라는 함수를 실행시키고자 하면 다음과 같이 입력하면 된다.

 

<?php

namespace App\Console;

use App\Http\Controllers\TestController;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
    ];
    protected function schedule(Schedule $schedule)
    {
        $schedule->call(function() {
            $testCtr = new TestController;
            $testCtr->testFunc();
            // testFunc라는 함수 실행
        })->daily();
    }

    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

$schedule->call 마지막 부분에 daily()라는 메서드가 추가되어있다. 이 메서드는 작업 간격 옵션을 뜻하는 것으로, testFunc라는 함수를 매일마다 실행시키기 위해 daily()라는 메서드를 추가하였다.

 

  • everyMinute() : 매분마다 실행한다.
  • hourly() : 매 시간마다 실행한다.
  • hourlyAt(9) : 매시 9분에 실행한다. ()에 0-59 사이의 원하는 분을 입력하면 된다.
  • daily() : 매일 실행한다.
  • dailyAt('09:00') : 매일 9시에 실행한다. ()에 0-23 사이의 원하는 시간을 입력하면 된다.
  • weekly() : 매주 실행한다.
  • weekly(6, '15:00') : 매주 토요일 15시에 실행한다. ()의 첫번째는 요일, 두번째 인자는 시간을 나타낸다.
  • monthly() : 매달 실행한다.
  • quarterly() : 매 분기마다 실행한다.
  • yearly() : 1년마다 실행한다.

실행 간격을 변경하고자 할 경우, daily()부분에 다른 메서드를 추가하면 된다.

 

2. 작업 실행

$schedule->call() 부분에 작업을 추가하는 것만으로 예약작업이 실행되지 않는다. 해당 작업들이 실행되도록 명령어를 하나 입력해준 이후에 작업이 정상적으로 실행된다.

* * * * * cd [프로젝트 경로] && php artisan schedule:run >> /dev/null 2>&1

위의 명령어를 터미널에 입력해줘야 한다. 위의 명령어를 입력해주면 크론탭이 매분 실행되면서 라라벨의 스케쥴러를 호출한다. 호출 될 때 마다, 라라벨 스케쥴러에 설정된 작업들의 실행시간을 계산하여 정해진 시간에 실행될 수 있도록 작동한다.

 

2-1. 로컬에서 작업 실행

php artisan schedule:work

크론탭을 활용하지 않고 라라벨 스케쥴러를 실행시키고자 할 경우, 프로젝트 경로의 터미널에 위의 명령어를 입력하면 된다. 크론탭과 동일한 방식으로 작동한다. 하지만 위의 artisan 명령은 수동으로 종료할 수 있으며, 해당 명령이 종료되고 나면 스케쥴 작업은 멈추게 된다.

 

2-2. 쉘 작업 실행

컨트롤러 연결된 함수를 실행시키는 기능 외에도 쉘 명령어를 실행할 수 있는 기능 또한 포함하고 있다.

$schedule->exec('bash /workspace/test.sh')->daily();

 

2-3. 백그라운드 작업 실행

예약 작업을 여러개 추가한 경우, 예약 작업들은 코드가 입력된 순서대로 순차적으로 실행된다. 만약 중간에 있는 작업의 실행 시간이 길 경우, 다른 작업들은 시간이 밀리게 된다. 모든 작업들을 동시에 실행시키기 위해서는 백그라운드에서 작업들을 실행시켜야 한다.

작업 간격 옵션 뒤에 runInBackground() 메서드를 추가하면 동시에 작업들을 실행 시킬 수 있다.

$schedule->call(function() {
	// 작업 내용
})->daily()->runInBackground(); // 동시에 백그라운드에서 작업 실행

 

3. Command로 작업 실행

위의 코드는 call() 함수 안에 실행할 작업들을 나열하였다. 하지만 command를 사용하여 실행할 작업 단위로 파일을 생성한 후, 예약 작업을 할당 시킬 수 있다.

 

3-1. Command 생성

php artisan make:command TestCommand

터미널에 위의 명령어를 입력한 경우, app\Console\Commands 폴더 안에 TestCommand라는 php파일이 생성된다.

 

3.2 - Commands 생성 파일

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class TestCommand extends Command
{

   protected $signature = 'command:name';
   // Kernel.php에서 해당 커맨드를 실행시키기 위한 이름 지정

   protected $description = 'Command description';
   // 어떤 작업인지 설명 추가

   public function __construct()
   {
       parent::__construct();
   }

   public function handle()
   {
       // 실행될 작업 내용
   }
}
  • $signature : Kernel.php의 $schedule->command()로 작업을 할당 할 때, 작업을 지정하기 위해 이름을 지정한다.
  • $description : 어떤 작업이 실행될 것인지 간략한 설명을 추가한다.
  • handle : 실행될 작업 내용들을 입력한다.

 

3-3. command 작업 할당

// Kernel.php

// command php파일 추가
protected $commands = [
   Commands\TestCommand::class
]; // 작업 할당을 위해 사용 커맨드php 파일들을 추가한다.

// 작업 추가
protected function schedule(Schedule $schedule)
{
	$schedule->command('command:name')->daily();
    // command()에 실행할 작업의 이름을 추가한다.
    // command:name으로 이름이 지정된 TestCommand.php의 handle()을 실행시킨다.
}
  • $commands : 예약 작업 내용을 담고 있는 php파일들을 불러온다. (use, import의 개념이다.)
  • command() : 실행할 예약 작업의 이름을 추가한다. $signature에 지정된 이름을 이 부분에 추가하면 된다.

위와 같이 입력 후, 크론을 실행하면 TestCommand.php의 handle()에 적혀있는 내용이 매일마다 실행되는 것을 확인할 수 있다.

 


참고 사이트 : 

https://laravel.com/docs/9.x/scheduling

 

Laravel - The PHP Framework For Web Artisans

Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small things.

laravel.com

 

https://www.cloudways.com/blog/laravel-cron-job-scheduling/

 

Laravel Cron Jobs Scheduling To Make Automation Easier

Laravel cron job scheduler is easy to use and allows easy scheduling of cron jobs at predetermined frequencies. Check out this tutorial on the topic

www.cloudways.com

 

https://stackoverflow.com/questions/55239730/laravel-whats-the-difference-between-schedule-call-daily-and-schedule#:~:text=The%20main%20difference%20is%20that,a%20couple%20of%20lines%20long.

 

Laravel: what's the difference between schedule->call()->daily()? and schedule->job()->daily()?

What changes if I call schedule->call(function() { .. do something ... })->daily() and if I call schedule->job(... my job class where handle do the same things... )->daily() ?

stackoverflow.com

 

728x90
반응형
Comments