[Laravel]バッチ(コマンド)処理の自動起動設定

Laravel

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内で簡単に起動時間を設定できていい感じですね。

詳しくは公式に色々書いてあるので、確認してみてください🤩

コメント

タイトルとURLをコピーしました