本日は、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
まとめ
今回はログを出力するだけの簡単な内容でした。ここまでお読みいただきありがとうございました。

最近のコメント