[Laravel] Job Schedule 사용하기

[Laravel] Job Schedule 사용하기 updated_at: 2024-01-30 17:55

Console을 이용한 Job Schedule

일반적인 방식

라라벨은 Job Schedule을 하기가 쉽게 구성되어 있다.
먼저 cron을 이용하여 schedule을 걸어보자
콘솔창에서 crontab을 편집 모드로 열자. 자세한 사용법은 리눅스 관련 명령어 및 리눅스에서 cron설정을 참조 하세요

crontab -e

그리고 아래를 약간 편집하여 넣어두도록 한다.

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

위와 같은 세팅으로 schedule을 정상적으로 돌아간다.
이제 남은 것은 언제, 어떤 것을 실행하느냐를 정의하는 것이다. 다음 예제는 session 테이블에 쌓인 로그를 특정시간마다 삭제하는 프로그램입니다. app\Console\Commands\clearCommand.php 파일을 생성하고 아래와 같이 편집하자.

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
.....
class clearCommand extends Command
{
    protected $signature = 'clear:daily'; // 이렇게 정의해 두면 php artisan list 명령에 노출된다.
    // 또한 php artisan clear:daily 를 이용하여 명령어를 바로 실행도 가능하다.
    protected $description = '간략한 설명';
    .....
       public function __construct()
    {
        parent::__construct();
    }
    .....

    /**
    * clearCommand 가 실행되면 handle()을 자동으로 실행시킨다.
    */
    public function handle()
    {
        $this->sessionsDelete();
    }

    private function sessionsDelete() {
        $date = date("Y-m-d H:i:s", strtotime( '-1 days' ) );
        DB::table('sessions')->where('expired_at', '<=', $date)->delete();
        DB::statement("optimize table sessions");
    }
}

콘솔에서 php artisan clear:daily 를 이용하여 정상적으로 실행되는지 확인해 보자. Class 파트는 완성되었다. 이제 이부분을 cron 에 걸어 두자
위에서 설정한 것 처럼 매분마다 크론은 실행되어 진다.
app\Console\Kernel.php 파일을 편집하자.

<?php
namespace App\Console;
....
class Kernel extends ConsoleKernel
{
    .....
    // 이 부분에는 위의 정의한 clearCommand 의 경로 및 클래스를 재정의 하면 된다.
    // 하지만 Commands 폴더에 정의된 커멘드는 따로 정의할 필요는 없습니다.
    // 여기서는 생략
    protected $commands = [
        // Commands\SendEmails::class
    ];

    ....
    // 매일 04:30분에 clear:daily 을 실행하게 정의
     protected function schedule(Schedule $schedule)
    {
        ......
        $schedule->command('clear:daily')->dailyAt('04:30');

    }

}

이로서 모든 정의는 끝났습니다.

Route Call 을 이용하여 직접 URL을 호출하는 방식

web route에 정의된 url 호출

Url을 직접호출 app\Console\Commands\CallRoute.php 파일 생성 2개의 인자값을 받아서 route로 전송하는 프로그램

<?php
....
namespace App\Console\Commands;
....
class CallRoute extends Command
{
    protected $signature = 'route:call {route} {arg1?} {arg2?}';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $arg1 = $this->argument('arg1') ? $this->argument('arg1') : null;
        $arg2 = $this->argument('arg2') ? $this->argument('arg2') : null;
        $request = Request::create($this->argument('route'), 'GET', array("arg1"=>$arg1, "arg2"=>$arg2));
        $this->info(app()->make(\Illuminate\Contracts\Http\Kernel::class)->handle($request));
    }
}

cron에 정의하자

cd /path-to-laravel-framework && php artisan route:call arg1.. arg2.. >> /dev/null 2>&1
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글