분류 php

Laravel (CronJob)에서 특정 시간에 실행되도록 작업 예약

컨텐츠 정보

  • 조회 351 (작성일 )

본문

좋은 날과 메리 크리스마스, 오늘은 앱을 구축 할 때 특정 시간에 실행할 수 있는 작업을 예약하는 방법을 알려 드리겠습니다. 때로는 매일 / 주간 / 월간 뉴스 레터를 발송하고 이 모든 작업은 수동으로 수행 할 수 없으므로 하루, 주, 월 또는 심지어 매분의 특정 시간에 실행되도록 예약하는 방법이 필요하므로 긴장을 풀고 그것에 뛰어 들자.


1 단계 : 새 Laravel 앱 설정 


1. laravel 설치 


composer create-project laravel/laravel laraveljobscheduler 


installing laravel 8 


2. 디렉토리로 변경 


cd laraveljobscheduler/ 


change to the directory 


2 단계 : 메일 설정 


이 단계에 대한 자세한 설명은 이전 기사에서 Gmail을 사용하여 Laravel 8에서 이메일을 아래쪽으로 보내는 방법을 참조하십시오.


.env file 


3 단계 : Gmail Mailable 설정 


이 단계에 대한 자세한 설명은 이전 기사에서 Gmail을 사용하여 Laravel 8에서 이메일을 아래쪽으로 보내는 방법을 참조하십시오.


1. 메일 만들기 


php artisan make:mail Gmail 


<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class Gmail extends Mailable
{
    use Queueable, SerializesModels;

    public $details;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($details)
    {
        $this->details = $details;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('Mail from Laravel Job Scheduler')
            ->view('emails.gmail')
            ->from('Kingsconsult001@gmail.com');
    }
}


2.보기 만들기 


<!DOCTYPE html>
<html>
<head>
    <title>kings</title>
</head>
<body>
    <h1>{{ $details['title'] }}</h1>
    <p>{{ $details['body'] }}</p>

    <p>Thank you for subscribing</p>
</body>
</html>


4 단계 : 메일을 보낼 작업 만들기 


Job을 사용하여 메일을 보낼 것이므로 Job을 생성 할 것입니다.


php artisan make:job SendEmailJob 


Jobs라는 새 폴더가 app /에 생성되므로 이후에 새 작업이 이 폴더에 저장됩니다.


new job 


우리 메일을 보내도록 수정합시다


<?php

namespace App\Jobs;

use App\Mail\Gmail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;

class SendEmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

        $details = [
            'title' => 'Thank you for subscribing to my newsletter',
            'body' => 'You will receive a newsletter every Fourth Friday of the month'

        ];
        Mail::to('kingsconsult001@gmail.com')->send(new Gmail($details));
    }
}


Job을 호출 할 때 handle() 메서드 내부의 코드가 실행할 코드가 되므로 handle() 메서드에 코드를 작성합니다. 위의 코드에서 Mail 및 Gmail 클래스를 가져온 다음 메일 세부 정보를 Gmail 클래스로 전달합니다. 메일 보내기에 대한 제 기사에서 설명합니다.


5 단계 : 특정 시간에 실행되도록 작업 예약 


마지막으로 작업이 실행될 시간을 예약해야 합니다. 이를 위해 app/Console/Kernel.php에 코드를 추가 할 것이므로 schedule() 메서드를 수정하겠습니다. 

커널 클래스보다 먼저 이러한 클래스를 가져옵니다.


use App\Jobs\SendEmailJob;
use Carbon\Carbon; 


   protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();
            $now = Carbon::now();
        $month = $now->format('F');
        $year = $now->format('yy');

        $fourthFridayMonthly = new Carbon('fourth friday of ' . $month . ' ' . $year);

        $schedule->job(new SendEmailJob)->monthlyOn($fourthFridayMonthly->format('d'), '13:46');
    }


위의 코드에서 매월 넷째 주 금요일 13:46 GMT에 뉴스 레터를 발송하려고 합니다. 해당 날짜와 시간을 사용하여 코드가 작동하는지 테스트 할 수 있습니다. 먼저 현재 시간을 초기화하고 월과 연도를 추출한 다음 현재 월과 연도의 네 번째 금요일에 실행되는 시간을 생성 한 변수에서 변수에 할당합니다. 마지막으로 지정한 날짜와 시간에 매월 실행되는 작업을 예약합니다.


Testing 


터미널에서 스케줄러 실행


php artisan schedule:work 


php artisan schedule:work 


내 상자에 들어온 우편물입니다.


inbox 


전체 코드는 이 github repo Kingsconsult/laravel-schedule-job에서 찾을 수 있습니다.


https://dev.to/kingsconsult/schedule-a-task-to-run-at-a-specific-time-in-laravel-cronjob-5aaf