박주니 개발 정리

schedule 사용 방법 및 설명 본문

라라벨

schedule 사용 방법 및 설명

박주니 2022. 12. 31. 21:43
728x90
반응형

laravel schedule은 crontab에서 체크하는 시간 단위로 조건을 실행할 때 사용합니다. 주로 자동화할 때 이용합니다.

 

laravel 환경을 다 구축했다는 전제 조건하에 진행하겠습니다. git bash, powershell에서 homestead 위치에서  vagrant ssh까지 진행해주시길 바랍니다. 

crontab 설정 방법

1. crontab -e을 입력해주시고 하단에 */1 * * * * cd [nginx 설정한 root 위치] && php artisan schedule:run >> /dev/null 2>&1을 입력해주시길 바랍니다. 

2.  엔터를 누르고 ctrl+x 를 눌러서 하단에  Save modified buffer 이 나오는 것을 확인합니다. 그 다음   y를 눌러서 File Name to Write가 나오면 엔터를 누르시면 됩니다.

3.  crontab -l 을 눌러서 제대로 설정되었는 지 확인합니다.

  • [nginx 설정한 root  위치]
    • laravel이 정상적으로 돌아간다는 것은 nginx을 정상적으로 연결되었다는 가정하에 nginx 설정한 root 위치를 보기 위해서는 상단에 이미지에 보이는 vagrant ssh까지만 접속한 위치에서 cd /etc/nginx/sites-available을 접속합니다. 
      1. ls를 입력 후 스케줄러를 진행할 백엔드 경로를 찾습니다. 저는 crypto_admin_backend을 연결했습니다.(2-1 이미지 참조)
      2. sudo vi crypto_admin_backend로 들어가서 설정한 내용을 확인합니다. 지금 보시는 분은 설정한 위치로 변경해서 들어가시면 됩니다. (2-2 이미지 참조)
      3. root 경로에서 연결 부위까지가  crontab에 root입니다. 예를 들면 현재 2-2에 보이는 이미지에서 /home/vagrant/code/crypto-admin-backend 까지 입니다. 
  • php artisan schedule:run >> /dev/null 2>&1
 

라라벨 8.x - 작업 스케줄링

라라벨 한글 메뉴얼 8.x - 작업 스케줄링

laravel.kr

1-1 참조 이미지

 

1-2 참조 이미지
2. 참조 이미지
3. 참조 이미지

 

 crontab 설정이 완료되었으면 laravel에서 schedule 설정을 진행합니다.

 

1.  App\Console\Commands 에서 Schedule 설정할 class를 설정합니다. 

  • 하단에 코드는 기본 form 입니다. 여기서 수정할 부분은  signature 입니다. kernel.php에서 체크 진행할 때  signature name 을 확인하기 때문입니다. 
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

use Config;

class CheckTest extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'checktest:store';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Check Test List';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
		// 1분단위로 체크할 함수 설정
        
    }


}

2. App\Console 에서 Kernel.php에 현재 schedule class를 연결합니다.

  1. use 에 연결하고자하는 shedule class를 설정합니다.
  2. protected  $commands  에 use에 설정한  class 를 연결합니다.
  3. protected function schedule에는 commend에는 아까 schedule class에 protected $signature 네이밍을 맞춰서 연결합니다.
  4. appendOutputTo에는 log 가 출력되는 부분임으로 해당 signature 네이밍에 맞춰서 logs/schedule_(signature 네이밍)을 넣으시면 됩니다. 
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Console\Commands\CheckTest;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */

    protected $commands = [
        CheckTest::class,
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // signature 연결
        $schedule->command('checktest:store')->everyMinute()->appendOutputTo(storage_path('logs/schedule_checktest.log'));
   

    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}

3. kernel 설정이 완료되었으면 schedule class에 handle 에 기본적으로 Log::info("test!!!")를 넣어서 어떻게 돌아가는 지 확인하시길 바랍니다.

  • 정상적으로 연결되었다면 1분 단위로 Log에서 test!!!가 나오는 것을 확인할 수 있을 것입니다. 만약 나오지 않는다면 연결하는 부분에 문제가 있을 수 있으므로 다시 확인해주시길 바랍니다. 

느낀점

schedule은 여러가지로 유용하게 사용이 됩니다. 예를 들어서 해당 상품이 종료일이 지났을 경우 그 이후에 이벤트를 진행할 때 직접 접속하지 않아도 계속 1분 단위로 돌아가고 있어서 자동으로 처리되는 것을 볼 수 있습니다. 

관리자 입장에서는 파트를 나눠서 schedule을 설정하면 효율적이게 관리할 수 있음을 느낄 수 있었습니다. 

추후에 현업에서 라라벨 schedule을 이용했는 지 공유하겠습니다.

728x90
반응형
Comments