Closed14
【Laravel】タスクスケジュール定義して、決まった時間に処理を実行したい

Laravelでバッチ処理を行いたいので、色々調べる。

を参考にする

タスクスケジュールは、app/Console/Kernel.phpファイルのscheduleメソッドで定義する。

Laravelのスケジューラを使用する場合、サーバに1分ごとにschedule:runコマンドを実行する単一のcron設定エントリを追加するだけ。
schedule:run Artisanコマンド
スケジュールしたすべてのタスクを評価し、サーバの現在の時刻に基づいてタスクを実行する必要があるかどうかを判断してくれる。
スケジューラの中に複数のタスクを定義しといて、単一のcron設定エントリを設定すればいいので、楽ですね。
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

* * * * *
は毎分

実際にタスクスケジュールを使ってみる。
1分ごとにメッセージを出力してみる。
Laravel8以降だと、cronを設定しないで、
php artisan schedule:work
を使うことでローカルでスケジューラーを呼ぶことができる。

Kernel.php
省略
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
echo "1分ごとに実行されるバッチ処理";
})->everyMinute();
}
省略

実行結果
できた

結構便利なメソッドが用意されている。

自分でartisanコマンド作って、スケジューラーでコマンド実行させたい。

artisan コマンド作成
php artisan make:command CountPlayer

プレイヤー数をカウントするartisanコマンド。
この後、スケジューラーで実行させる。
app/Console/Commands/CountPlayer.php
省略
public function handle()
{
logger("{$count}プレイヤーいました!");
}

実行してみる。
Kernel.php
protected function schedule(Schedule $schedule)
{
//コールバックを1分毎に実行
$schedule->call(function () {
logger("1分ごとに実行されるバッチ処理");
})->everyMinute();
//定義したカスタムartisanコマンドを2分毎に実行
$schedule->command(CountPlayer::class)->everyTwoMinutes();
}

実行結果
このスクラップは2023/10/09にクローズされました