[Laravel] Job Schedule 사용하기
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