laravelで作ったバッチ処理(コマンド)を自動的に処理させる方法を書いています。
前回バッチコマンドを作ったので、それを自動起動設定させてみました。
公式のこの辺りの内容になります。
cron(クーロン) に自動起動設定
laravelで作ったバッチ処理(コマンド)の自動起動設定をする場合は
ターミナルを開いて、crontab -eでcronの設定編集画面を開きます。
ルート(/)からの絶対パスで、作ったプロジェクトの配下を指定します。
プロジェクトのartisanファイルが置いてある場所です。下記のように書き込んだらファイルを閉じます。
viで開くかと思うので、入力したらescを押して、:wqで保存して抜けれます。
* * * * * cd /自分のプロジェクトへの絶対パス && php artisan schedule:run >> /dev/null 2>&1
上記の設定の意味は
毎分、cdでプロジェクトパスへの移動をやった後にphp artisan schedule:runのコマンドが走ります。
これが動くと、app/Console/Kernel.phpのscheduleメソッドに書いてある内容が処理されます。
>> /dev/null 2>&1
は出力結果があった場合は、無視して捨てるようにしています。
(この書き方についてはwebに色々記事があるので調べてみてください😗 この辺とかわかりやすいです。)
スケジュールを記載する
app/Console/Kernel.phpのscheduleメソッドに実行したいバッチのコマンドを書いていくと、それぞれの設定内容で実行してくれます。
実行時間についてのオプションは公式のこちらに書いています。
よく使いそうなものだけ下記に記載してみました。
毎分実行する
スケジュールに下記のように書くと毎分実行できます。
commandメソッドに作ったコマンドの名前を書いて、everyMinuteメソッドを呼ぶだけです。
protected function schedule(Schedule $schedule)
{
$schedule->command('command:test')->everyMinute();
}
毎時間実行する
1時間に一回実行したい場合は下記のようにします。
$schedule->command('command:test')->hourly();
毎日実行する
1日に1回実行したい場合は、下記のようにします。
毎日の0時0分に実行されます。
$schedule->command('command:test')->daily();
毎日実行するけど、時間指定する
dailyAtを使って時間表記すると、1日に1回指定時刻に実行してくれます。
$schedule->command('command:test')->dailyAt('18:00');
毎月実行する
月に1回実行したい場合は、下記のようにします。
毎月1日の0時0分に実行されます。
$schedule->command('command:test')->monthly();
毎月実行するけど、日にちと時刻を指定する
monthlyOnを使うと、日付と実行時間を指定できます。
第1引数に日付、第2引数に時刻です。
$schedule->command('command:test')->monthlyOn(7, '18:00');
コマンドに引数を渡したい
コンソールと実行するときと同じように、コマンドを書いた後に引数を渡すだけです。
$schedule->command('command:test taro 22')->everyMinute();
スケジュールされたタスクの二重起動防止
タスクが重複起動しないようにするには下記のようにします。
時間になっても終わっていない場合は、2回目以降の実行が無視されます。
$schedule->command('command:test')->withoutOverlapping();
スケジュール実行を試してみる
前回作ったコマンドをスケジューラーに登録して実行してみました。
スケジューラーの内容
引数違いの同じコマンドを複数定義して、毎分動くようにしてみました。
protected function schedule(Schedule $schedule)
{
$schedule->command('command:test')->everyMinute();
$schedule->command('command:test hanako 12')->everyMinute();
$schedule->command('command:test yamada 31')->everyMinute();
$schedule->command('command:test yamada 23')->everyMinute();
}
自動実行された結果
1分経って、Logを確認すると、実行されているのが確認できました。
[2020-08-27 07:53:01] local.INFO: start construnct
[2020-08-27 07:53:01] local.INFO: 10歳のtaroさん、Hello✋
[2020-08-27 07:53:01] local.INFO: start construnct
[2020-08-27 07:53:01] local.INFO: 12歳のhanakoさん、Hello✋
[2020-08-27 07:53:01] local.INFO: start construnct
[2020-08-27 07:53:01] local.INFO: 31歳のyamadaさん、Hello✋
[2020-08-27 07:53:01] local.INFO: start construnct
[2020-08-27 07:53:01] local.INFO: 23歳のyamadaさん、Hello✋
まとめ
自動起動するための設定と、スケジューラーで使いそうなオプションを挙げてみました。
cronに毎分実行するように設定しておいて、laravel内で簡単に起動時間を設定できていい感じですね。
詳しくは公式に色々書いてあるので、確認してみてください🤩
コメント