Laravel(6.x)でバッチの作り方

Laravelはバッチプログラムも非常に簡単に作成することができます
また定期実行させるためのスケジュール登録も柔軟に行えるので
cron設定で悩まされることもありません

artisanでコマンドを作成する

php artisan make:command HelloBatch

Laravelのバッチ処理は、コマンドを作成することで実現でき、スケジュールに登録することで定期実行させることができます
もちろんコマンドを作っているので php artisan {作ったコマンド} でCUI実行
することも可能です

上記コマンドを実行すると、Commands配下にファイルが作成されます

作られたテンプレートは以下です

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

$signature = ‘command:name’;
がコマンド名にあたるので ’command:hellobatch’ などとすると
php artisan command:hellobatchで実行できるようになります

handle()の中身が、実際にコマンドで処理される内容となります
ここにバッチ処理させたい内容をコーディングしていきます

バッチをスケジュール登録する

バッチのスケジュールをcronに設定して実行させるケースも多いと思いますが
Laravelではcronへの記載は1つのみであとはLaravel側で判断して
スケジュール実行してくれます

では実際にどうやるかというと
Commandsフォルダと同階層にある Kernel.php に記載していきます
たとえば先程つくったHelloBatchを1日1回、朝8時に実行したいとします

Kernel.phpファイルの scheduleメソッドに記載します

protected function schedule(Schedule $schedule)
{
    $schedule->command('command:hellobatch')->dailyAt('08:00');
}

dailyAt(’08:00′)で毎日8時に実行するようにしました
他にも様々なオプションがあるのでリファレンスで確認してみてください

https://readouble.com/laravel/6.x/ja/scheduling.html#schedule-frequency-options

たったこれだけでスケジュール登録は完了です
他のバッチも追加する場合はscheduleに追加していくだけでOKです

protected function schedule(Schedule $schedule)
{
    $schedule->command('command:hellobatch')->dailyAt('08:00');
    $schedule->command('command:anotherbatch')->hourly();
}

cron設定する

ではLaravelのスケジュール登録したのでサーバがLaravelのコマンドたちを
実行してくれるように1つだけcronを設定します

* * * * * cd /project && php artisan schedule:run >> /dev/null 2>&1

cronの内容を軽く説明しておくと

  • * * * * * で毎秒実行している(ただしLaravelのスケジュールをみて実行するしないを判断している)
  • cd /project で Laravelのあるプロジェクトフォルダまで移動
  • php artisan schedule:run でscheduleメソッドに登録されたコマンドを実行
  • >> /dev/null 2>&1 はこのcron実行結果の標準エラー出力を標準出力にまとめて /dev/nullに捨てています(つまりはログを出さないようにしているということですね)

cronで一括実行するので標準出力にまとめてだすとなんのバッチか
わからなくなります、ログはそれぞれのバッチで必要な箇所で
try{}catchを組むなどして出力させてあげましょう

まとめ

Laravelでのバッチの作成方法の紹介でした
レンタルサーバなどで管理画面からcron設定できることもありますが
それぞれでcron設定して数が増えてくると管理がめんどうになってきます

Laravelのコマンドとスケジュールは管理もしやすく実行タイミングも
わかりやすく書けるので有用だと思います