일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 기초 수학
- php
- Babel
- linux
- 블레이드 템플릿
- docker
- nginx
- Machine Learning
- Redux
- For
- Backbone.js
- mariadb
- python
- phpredis
- nodejs
- CentOS
- Switch
- Redis
- rabbitmq
- Node
- SQL
- deep learning
- webpack
- React
- fastapi
- laravel
- AWS
- javascript
- Go
- NCP
- Today
- Total
개발일기
Laravel - Schedule 예약 작업 실행 본문
기존에 예약 작업을 실행하기 위해서는 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
https://www.cloudways.com/blog/laravel-cron-job-scheduling/
'프로그래밍 언어 > PHP - Laravel' 카테고리의 다른 글
Laravel - Laravel Forge: file_put_contents(): failed to open stream: Permission denied (0) | 2022.09.02 |
---|---|
Laravel - slug url 생성 (0) | 2022.08.20 |
Laravel - 비동기 페이지네이션 (0) | 2022.07.25 |
Laravel - Pagination 사용법 (0) | 2022.07.23 |
Laravel - Laravel Mix 사용법 (0) | 2022.07.23 |