カテゴリー: BackEnd

Laravelのバッチ処理を作る

はじめに

こんにちは。webアプリにつきもののバッチ処理ですが、もちろんLaravelでもサポートされていて、crontabに書き散らすことなくバッチを設定できます。
今回はLaravelでコンソールやcronから処理を呼び出し、バッチとして実行する方法を紹介します。

環境

  • PHP 7.3.3
  • Laravel 5.8.21

artisanコマンド作成

以下のコマンドで、Artisanコマンドを自作します。ここで作成するコマンドはphp artisanでCUIから実行できますし、今回のテーマであるバッチ処理でも呼び出すことができます。

$ php artisan make:command TestBatch
Console command created successfully.

これでapp/Console/CommandsTestBatch.phpが作成されます。

where('email', '=', 'nomura@example.com')->get();
    }
}

これでもうartisanコマンドから呼び出せるようになっています。確認してみましょう。

$ php artisan list
Laravel Framework 5.8.21

(中略)

Available commands:

(中略)

 batch
  batch:test           お試しのバッチ処理
(中略)

このように表示されればOKです。php artisan batch:testをコンソールから実行することで、先ほどのTestBatchクラスのhandleメソッドが呼び出されます。

artisanコマンドをバッチとして登録する

コンソールからartisanコマンドとして呼び出せるようになりました。同じ要領でartisanコマンドを必要なだけ作り、全てcrontabに登録してもよいのですが、バッチが増えるほど煩雑になり、管理しづらくなります。
Laravel内に全てのコマンドを登録し、見通しよく管理できるようにしましょう。app/Console/Kernel.phpを編集します。

call(function () {
            echo "hello!\n";
        });

        // batch:testを毎時実行し、出力先を$filePathに指定する
        $schedule->command('batch:test')
        ->sendOutputTo($filePath)
        ->hourly();
    }

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

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

上記のsendOutputTohourly以外にも様々な制御が可能です。公式ドキュメントで網羅されていますので、是非見てみてください。
あとはcrontabに1行追加するだけで、Kernel.phpに登録したコマンドがそれぞれ実行されるようになります。

$ crontab -e

# do daily/weekly/monthly maintenance
# min   hour    day     month   weekday command
*/15    *       *       *       *       run-parts /etc/periodic/15min
0       *       *       *       *       run-parts /etc/periodic/hourly
0       2       *       *       *       run-parts /etc/periodic/daily
0       3       *       *       6       run-parts /etc/periodic/weekly
0       5       1       *       *       run-parts /etc/periodic/monthly
# 以下1行を追記する
*       *       *       *       *       cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

これで完了です。
※ 今回初めてAlpine Linuxのcrontabを触りましたが、Redhat系のcrontabと比べてコメントが親切ですね…

さいごに

以前はcrontabをテキストファイルとしてリポジトリに登録したり、もしくはサーバ上のcrontabを直接編集したりすることが私はほとんどでした。こうやってコード上で管理でき、分かりやすく制御できるのは素晴らしいですね。

おすすめ書籍

nomura

シェア
執筆者:
nomura
タグ: phplaravel

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前