見出し画像

laravel8のバッチを時間指定して起動させる

前回の記事でバッチを作ってみました。

なのでそのバッチを時間指定して起動させる方法を今回は書きます。

起動時間は App\Console\Kernel.php のscheduleメソッドに記載します。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Facades\DB;

class Kernel extends ConsoleKernel
{
   /**
    * アプリケーションで提供するArtisanコマンド
    *
    * @var array
    */
   protected $commands = [
       //
   ];

   /**
    * アプリケーションのコマンド実行スケジュール定義
    *
    * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
    * @return void
    */
   protected function schedule(Schedule $schedule)
   {
       // ここにスケジュールを書きます
   }
}

ではどのように書いていくかというと、下記のように設定します。
こちらは毎日、キャッシュクリアをするように設定しています。

$schedule->command('config:clear')->daily();

commadに書くコマンドは、artisanコマンドで確認できます。
こちらを実行して、設定してください。

php artisan list

時間設定に関しては、分単位から、日単位、月単位、年単位とどのようにも設定できます。

よく使うのを載せておきます。

->everyMinute();	        // 毎分タスク実行
->hourly();	                // 毎時タスク実行
->dailyAt('13:00');	        // 毎日13:00に実行
->monthlyOn(4, '15:00');	// 毎月4日の15:00に実行
->lastDayOfMonth('15:00');	// 毎月最終日の15:00時に実行

時間成約とかもつけることができるのでさらに便利です。
毎時で設定した場合、夜間だけバッチを起動したくないみたいなこともあるかと思います。
そういう場合は時間成約を入れると、書く手間が省けます。

->between('7:00', '22:00'); // 7:00〜22:00の間で実行する
->unlessBetween('23:00', '4:00'); // 23:00〜4:00を除外して実行する

環境ごとの成約もできます。
テスト環境だけ実行したくないみたいなこともあるかと思います。
その場合はこちらを設定してください。
.envファイルのAPP_ENVで環境を設定すると思います。

->environments(['staging', 'production']); // 環境がstagingとproductionのみ実行

最後にサーバの設定を記載しておきます。
これをやっておかないとバッチは起動しません。
cronに1分ごとにschedule:runコマンドを実行するように記載します。

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

cronに1つコマンドを記載しないといけないですが、ソースファイルでバッチのスケジュール管理ができるのが良いですね!

cronの設定は、パッと見でわかりづらいので個人的にはソースで書けてすごく助かっています。

みなさんもぜひ使ってみてください。

この記事が気に入ったらサポートをしてみませんか?