ソムリエでエンジニアのブログ

ワインの事も書きたいけど基本エンジニア用

Laravelでバッチ処理を実装

はじめに

開発中のシステムで月初に決められた処理を実施するような機能を実装したのでまとめておきます。
定期処理を実施する記述などLaravelを利用するとシンプルに実装する事ができ驚きました。

実装環境

Laravelのバージョンは現時点で最新の8系を利用して動作の確認を行なっています。

実装の手順

以下手順で実装を進める事でバッチ処理を実現します。
1. Aritsanコマンドを自作
2.タスクスケジュールに作成したArtisanコマンドを登録
3.Linuxのcronに登録

では、ここから実際にコードを書いていきます。

Artisanコマンドの自作

Laravelではコマンドファイルの雛形を作成するartisanコマンドが用意されています。以下のコマンドを入力する事でApp/Console/Commandsディレクトリ以下にファイルが作成されます。

$ php artisan make:command [ファイル名]

上記コマンドを入力すると以下の以下のファイルを作成します。(今回は、SampleBatchという名前で作成した例を記載します。)

<?php

namespace App\Console\Commands;

use IlluminateConsoleCommand;

class Sample 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 int
     */
    public function handle()
    {
        return 0;
    }
}

各項目の説明

$signature
実行するコンソールコマンドの名前。コンソールにてこの名前で実行する事が可能です。
$description
コマンドの説明文。代入された値は、php artisan listで表示されるArtisanコマンド一覧に表示されます。
handle()
このコマンドを実行したときの処理されます。
続いて作成したファイルに定期実行させたい処理を実際に書いていきたいと思います。

実装例

今回はUserテーブル年齢が20歳以上のデータを全てAdultテーブルに保存する処理を作成してみます。※処理の内容がリアルでない事はご了承ください、、(汗)

<?php

namespace AppConsoleCommands;

use IlluminateConsoleCommand;
use App\Models\User;
use App\Models\Adult;

class Sample extends Command
{
    protected $signature = 'command:adultSave';

    protected $description = '20歳以上のユーザーをAdultテーブルに保存';

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $targetUsers = User::where('age', '>=', 20)->get();
        
        foreach ($targetUsers as $user) {
            Adult::create(['name' => $user->name, 'age' => $user->age]);
        }
        return;
    }
}

作成したコマンドは以下のようにコマンドを入力する事でも実行する事が可能です。

$ php artisan command:adultSave

タスクスケジュールに作成したArtisanコマンドを登録

ここまでで実行したい処理の実装は完了しました。次に、定期的に実行するタイミングを指定していきたいと思います。
Laravelでは、app/Console/Kernel.phpのscheduleメソッドに実行したいバッチのコマンド記載していく事で処理を実行するタイミングを指定する事が可能です。

<?php
// ......省略

// 1時間に1回adultSave処理を実行する
protected function schedule(Schedule $schedule)
{
    $schedule->command('command:adultSave')->hourly();
}

実行するタイミングに関しては色々と用意されているので詳しくは公式のドキュメントを確認してみてください。

readouble.com

cronの設定

Laravelのスケジュール登録したのでサーバがLaravelのコマンドを実行してくれるようにcronを設定します。
Laravelのタスクスケジュールを設定する場合は、Cronへのエントリーを1つ加えるだけでタスク毎にCronへのエントリーを追加する必要はありません。

// crontabの編集
$ crontab -e

php /var/www/[プロジェクトフォルダ名]/artisan schedule:run >> /dev/null 2>&1

上記の記述でlaravelスケジューラが毎分実行され、その都度、実行するべきタスクがあれば実行されます。

まとめ

実装前はややこしそうなイメージでしたが結果的には、非常にシンプルに実装する事ができました。
改善箇所などあればコメント頂けますと幸いです。