개요
스케줄링이란
서버에다가 특정 시간마다 또는 특정 주기마다 작업을 예약해 놓는 기능을 의미합니다.
라라벨에서는 스케줄링 기능을 지원하고 있습니다.
스케줄링
우선 로컬 개발환경에서 1분마다 로그를 찍는 스케줄링을 만들어봅시다.
아래의 코드처럼 수정해 줍시다.
app/Console/Kernel.php
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->call(function(){
\Log::info("Hi : ".now());
})->everyMinute();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
여기서 $schedule->call()안에 저는 클로저(익명 함수)를 만들고 내용을 현재 시간을 출력하는 것으로 했습니다.
그리고 everyMinute()를 사용해 매분마다 실행하는 것으로 했죠.
이걸 로컬에서 실행시키는 법은 간단합니다.
php artisan schedule:work
이제 매분마다 라라벨 로그 파일(storage/logs/laravel.log)에 로그가 쌓이는 것과
커맨드가 올라오는 것을 확인할 수 있습니다.
만약 매분이 아닌 다른 시간으로 하고 싶으시면 아래 문서로 들어가셔서 알맞은 함수를 찾으시면 됩니다.
https://laravel.com/docs/9.x/scheduling#schedule-frequency-options
또한 현재 실행 중인 스케줄링을 확인하고 싶으시면 아래 명령어를 사용하면 됩니다.
php artisan schedule:list
Cron, Crontab
위에서 스케줄링이 백그라운드로 돌아가지 않기 때문에 실서버 적용이 어렵습니다.
그 문제를 해결하기 위해 crontab에 등록하도록 합시다.
crontab은 리눅스에서 특정 시간마다 특정 작업을 해주는 친구입니다.
즉 스케줄러이죠, 이 crontab에 라라벨 스케줄러를 등록해서 백그라운드에서 사용하는 것입니다.
이러면 실서버에서도 스케줄러를 사용할 수 있습니다
저의 경우 홈스테드 환경에서 crontab의 경로는 아래와 같습니다.
sudo vi /etc/crontab
이제 아래와 같은 파일 내용을 확인할 수 있습니다.
차례대로 시간, 계정, 명령어입니다, 주석이 되어있으므로 참고하시면 됩니다.
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
우리는 매분 실행되게 할 것이므로 아래와 같은 문장을 넣어줍시다, 프로젝트 경로는 알맞게 수정해 주세요.
* * * * * root cd /home/vagrant/code/프로젝트명 && php artisan schedule:run >> /dev/null 2>&1
저장 후 아래 명령어를 입력하시면 스케줄러가 크론을 통해 실행이 됩니다.
sudo systemctl restart cron
# 만약 에러가 나면 아래 명령어로
sudo systemctl restart crond.service
아래와 같이 결과를 확인할 수 있으며 php artisan schedule:work 보다 약간의 딜레이가 존재합니다.
저의 경우 2초의 차이가 발생했네요
'PHP > Laravel' 카테고리의 다른 글
[Laravel9] 라라벨 이메일 보내기 with Google SMTP, Markdown (0) | 2022.10.24 |
---|---|
Laravel 9 Observer 써보자, 옵저버로 이력(히스토리) 쌓기 (0) | 2022.09.23 |
Laravel9 라라벨 csv 읽어서 저장하기(CSV seeding) (0) | 2022.09.07 |
Laravel9 이미지 업로드 (with Dropzone) 2부 : Index & Destroy & Ajax (0) | 2022.08.30 |
Laravel9 이미지 업로드 (with Dropzone) 1부 : Setting & Create & Image Upload (0) | 2022.08.29 |