見出し画像

Laravel8での便利なタスクスケジュール♪

ひさびさに書きます!
最近、仕事が忙しくて書いてなかったので、アウトプットも兼ねて書いていいきます。

Laravelでバッチをつくるときは多々あるかと思いますが、そのバッチを動かすときによく使うのがタスクスケジュール。

いつ何時になにを動かすかを定義するのは便利ですよね。
どう書くかはこちらを見てもらえると良いかと思います。

プラスで便利だと思ったのを紹介します。

タスク多重起動の防止

デフォルトだと同じジョブが起動中でも、スケジュールされたジョブは実行されてしまいます。
それを防止するのがこの関数!

$schedule->command('emails:send')->everyMinute()->withoutOverlapping();

これは毎分実行されるバッチですが、このときに emails:sendが1分以上かかった場合、同じ処理が実行されてしまいます。
そのため、withoutOverlapping()を使って、前のジョブが終わるまでロックをすることができます。

何分ロックをかけると設定ができるので非常に便利。

->withoutOverlapping(10);

これは最大10分のロックをかけます。
10分以内にバッチが終わったら、開放します。

単一サーバ上でのタスク実行

次はこちら!
普通のwebサーバでは、複数台のサーバで処理をするのが一般的かと思います。
複数のサーバを利用して負荷分散したりと、工夫されているところはいっぱいあるのではないでしょうか。
バッチ用のサーバをたてるのも良いですが、この関数をつけることで単一サーバで処理を実行するようになります。

$schedule->command('emails:send')->fridays()->at('17:00')->onOneServer();

これは金曜日17時にメール送信を実行しますが、仮に2台のサーバで運用していた場合、onOneServer()がない場合は2通飛んでしまいます。

それだと微妙なので先に実行された方がロックをかけて、1通しか飛ばないようにします。

まとめ

めちゃ便利ですね!
多重起動でバグってしまったなどよくあることなので、気をつけときたいですね!
また、サーバが一台だったら気にしなくて良いことでも規模が大きくなると複数台のサーバにせざる得ません。
そんなときはこの関数を思い出していただければと思います。
また便利なのがあれば書いていきます。

この記事が気に入ったらサポートをしてみませんか?