本日は、Laravelのタスクスケジュールを使って定期的な処理を実行する方法についてまとめます。
バージョン
Laravel 8.X
はじめに
Laravelで定期的な処理を実行したい場合、タスクスケジュールを利用することで、シンプルに実装することが可能です。通常Linux系のOSで定期的な処理を実行する場合、タスク毎にCronエントリーを追加します。LaravelもCronを利用しますが、Cronエントリーの追加は一つだけで済みます。各タスクの管理はLaravel側で行うため、タスクの追加を効率よく行うことができます。
スケジューラを使いはじめる
スケジューラを使うには、サーバーに下記のようなCronエントリーを追加します。
* * * * * cd [プロジェクトのパス] && php artisan schedule:run >> /dev/null 2>&1
このCronエントリーは、スケジューラを毎分呼び出し、その時点で実行する必要のある処理を行います。
ローカル環境でCronを使えない、使いたくない場合
Laravel 8.X以降は、下記のコマンドを使用することで、Cronがなくとも動作確認が行えます。
$ php artisan schedule:work
スケジューラの定義
タスクスケジュールはapp/Console/Kernel.phpのschedule()関数内に記述します。下記はKernel.phpのデフォルトの内容です。
namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel { /** * The Artisan commands provided by your application. * * @var array */ protected $commands = [ // ]; /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // $schedule->command('inspire')->hourly(); } /** * Register the commands for the application. * * @return void */ protected function commands() { $this->load(__DIR__.'/Commands'); require base_path('routes/console.php'); } }
今回はartisanコマンドを作成し、タスクスケジュールに登録してみます。
artisanコマンドの作成
$ php artisan make:command WriteLog
コマンドはapp/Console/Commandsに作成されます。ここでは動作確認のためWriteLogというクラスを作成しています。下記はWriteLog.phpのデフォルトの内容です。
namespace App\Console\Commands; use Illuminate\Console\Command; class WriteLog extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'command:name'; /** * The console command description. * * @var string */ protected $description = 'Command description'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return int */ public function handle() { return 0; } }
$signatureにはコマンドの名前を入れます。
protected $signature = 'writelog';
$descriptionにはコマンドの説明を入れます。
protected $description = 'ログ出力';
handle()内には処理内容を記述します。ここではヘルパー関数logger()を使用し、ログを出力する記述しています。
public function handle() { logger('test'); }
artisanコマンドの登録
コマンドを作成しましたが、実行できるようにするためにはコマンドの登録が必要です。app/Console/Kernel.phpの$commands変数にコマンドを登録します。
protected $commands = [ Commands\WriteLog::Class, ];
artisanコマンドの実行
$ php artisan writelog
実行するとstorage/logs/laravel.logに下記のログが出力されます。
[XXXX-XX-XX XX:XX:XX] local.INFO: test
タスクスケジュールの登録
最後に、作成したコマンドをタスクスケジュールに登録します。app/Console/Kernel.phpのschedule()関数内に下記の内容を記述します。ここでは、動作確認のため毎分実行しています。
protected function schedule(Schedule $schedule) { $schedule->command('writelog')->everyMinute(); }
ログを見ると、毎分実行されていることが確認できます。
[XXXX-XX-XX XX:00:XX] local.INFO: test [XXXX-XX-XX XX:01:XX] local.INFO: test [XXXX-XX-XX XX:02:XX] local.INFO: test [XXXX-XX-XX XX:03:XX] local.INFO: test [XXXX-XX-XX XX:04:XX] local.INFO: test
まとめ
今回はログを出力するだけの簡単な内容でした。ここまでお読みいただきありがとうございました。
最近のコメント