こんにちは。webアプリにつきもののバッチ処理ですが、もちろんLaravelでもサポートされていて、crontabに書き散らすことなくバッチを設定できます。
今回はLaravelでコンソールやcronから処理を呼び出し、バッチとして実行する方法を紹介します。
以下のコマンドで、Artisanコマンドを自作します。ここで作成するコマンドはphp artisan
でCUIから実行できますし、今回のテーマであるバッチ処理でも呼び出すことができます。
$ php artisan make:command TestBatch Console command created successfully.
これでapp/Console/Commands
にTestBatch.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コマンドを必要なだけ作り、全て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'); } }
上記のsendOutputTo
やhourly
以外にも様々な制御が可能です。公式ドキュメントで網羅されていますので、是非見てみてください。
あとは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を直接編集したりすることが私はほとんどでした。こうやってコード上で管理でき、分かりやすく制御できるのは素晴らしいですね。