일정 시간이 되면 저절로 컴퓨터가 작업 해 주면 좋겠는데..
개발을 진행하다 보면 일정 시간이 되면 알아서 컴퓨터가 특정 작업을 해 주면 좋은 상황이 반드시 오게 되어 있다.
어떤 상황인지에 따라서 해결 할 수 있는 방법으로는 굉장히 여러가지가 있는데,
단순히 DB에 일정 데이터를 삽입하거나 수정하는 거라면 DB 자체의 스케줄링을 사용 해도 될 것이고
서버에서의 cron이나 window 서버라면 window 서버의 작업 스케줄링을 사용해도 될 것이다.
그 중에서도 이번에는 Laravel 의 Task Scheduling 기능에 대해 포스팅 해 보려고 한다.
왜 Laravel Scheduling을 사용해?
위에서는 여러가지 방안이 존재한다고 했는데, 왜 소스코드 상에서의 Scheduling을 사용할까?
당연하짐나 DB 스케쥴링의 경우에는 할 수 있는 작업이 한정적이다.
OS에서 제공하는 cron, Scheduling 기능으로도 처리가 가능하긴 하지만, 여러가지 제약이 있는건 마찬가지이다.
서버에 직접 접근해서 처리해야 한다는 점, 내부 API를 이용해야 하는 상황이 온다면 이에 따른 부가 처리라던가..
공식 사이트에서는 다음과 같이 안내하고 있다.
In the past, you may have written a cron configuration entry for each task you needed to schedule on your server. However, this can quickly become a pain because your task schedule is no longer in source control and you must SSH into your server to view your existing cron entries or add additional entries.
그러면 어떻게 작성하고, 실행해야 할까?
Laravel Schduleing의 경우, 굉장히 간단하게 스케줄링 항목을 관리하고 실행해 줄 수 있다.
app/Console/Kernel.php 에서 스케줄링 작성이 가능하다.
들어가서 확인해 보면, 다음과 같은 부분이 있다.
protected function schedule(Schedule $schedule): void
{
// $schedule->command('inspire')->hourly();
}
해당 부분 안쪽에 스케줄링을 작성해 주면 된다.
작성해 둔 스케줄링의 항목을 확인하는 방법은 다음과 같다.
$schedule->call(function() {
// 실행해야 할 코드를 작성하거나, 함수를 호출
})->daily();
코드 실행 뿐만 아니라
exec 방식으로 셀 명령 에약, command 방식으로 arsian 명령어 예약, job 예약도 가능하다.
해당 명령어 뒤에 붙은 daily() 같은 경우에는 매일 자정에 작업을 실행하는 명령어인데, 부가적으로 자주 쓰는 얘들을 일부만 소개 해 보면
cron('* * * * *'), everyMinute() 등이 존재한다.
cron같은 경우는 cron의 작업 스케줄링 등록 방식과 동일하다.
이외의 일정 빈도 옵션은 공식 홈페이지에 자세히 나타나 있고, 일정 제약 방식도 자세히 소개 되어 있으니 공식 문서를 확인하면서 필요한 방식을 사용하면 될 것 같다.
https://laravel.com/docs/10.x/scheduling#main-content
또한 나는 해당사항이 없지만, 여러 서버를 돌려야 하는 경우 각 서버가 스케줄링을 실행한다면 굉장히 귀찮은 일이 벌어지게 될텐데..
다행히 작업 중복 방지와 하나의 서버에서만 작업이 실행되게끔도 제한이 가능하다.
withoutOverlapping과 onOneServer 방식인데
onOneServer의 경우 DB에 접속이 가능한 환경이어야 한다.
일반적으로 등록된 스케줄러를 확인한는 방법은 다음과 같다.
php artisan schedule:list
스케줄링 실행은 아래와 같다.
php artisan schedule:run 방식은 실제로 구동시킬 때 사용하는 방식이고,
php artisan schedule:work 방식은 로컬에서 테스트 시에 사용하는 명령어 이다.
서버에서 실행 할 때는 매분 명령을 실행하는 하나의 cron 항목을 추가해야 한다.
cron 항목에 다음과 같은 내용을 추가해주자.
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
work 방식은 로컬에서 work을 실행해 두고 스케줄링 시간이 되면 저절로 돌아가는걸 확인할 수 있다.
테스트를 한번 해보자!
일단, 본 작업에 들어가기 전에 스케줄링이 정상적으로 실행되는지 먼저 테스트를 해보자.
$schedule->call(function() {
print_r('schedule test');
})->everyMinute();
테스트니까, 일단 1분마다 돌아가게끔 간단한 코드를 작성해 준 뒤,
로컬 환경에서 테스트를 진행하는 것 이다 보니
php artisan schedule:work 방식으로 구동을 시킨다.
이후, 정호가히 1분마다 뭔가가 실행되고 있는걸 확인 할 수 있었다.
딱히 설명한 적은 없지만, Laravel Telescope를 이용해서 확인해 보면 정상적으로 작동하고 있음을 확인 할 수 있다.
일단 구축은 끝났으니, 실제로 돌아가야 하는 로직들을 구축하고 와야겠다.
'PHP > PHP' 카테고리의 다른 글
[Laravel] API 서버로 활용 할 때, 기본 laravel 오류 메시지 안뜨게 처리 (0) | 2023.06.05 |
---|---|
[Laravel] Schedule + job(queue) (0) | 2023.05.12 |
[Laravel] XSS Protect Middleware 구축 ( + CSRF 보호에 대한 주저리..) (0) | 2023.04.27 |
Laravel Sanctum과 Passport 차이, Passport의 인증방식들 정리 (0) | 2023.04.05 |
Laravel, Laravel Octane 그냥 공부 메모.. (0) | 2023.04.04 |