laravelでバッチ処理を実行・タスクをスケジュール化する。
夜間で、集計処理とか、月次データの作成とかしたいですよね・・・
したいです!って言う事で、今回はlaravelでバッチを作成する方法を調べます。
実装ステップとして
①バッチ処理を作成する。
②手動でバッチ処理を実行して結果を見る
③定時で実行を実装する。
この3ステップでいきます。
バッチ処理を作成ですが下記のコマンドでファイルを作成します。
php artisan make:command ○○Batch
バッチ名は、○○Batchとかにしとけばよいでしょう。
実行するとApp\Console\Commands配下にファイルが作成されます。
ファイルの中身はこんな感じです。
<?php
namespace AppConsoleCommands;
use IlluminateConsoleCommand;
class TestBatch 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;
}
}
上から編集するのは3点となります。
- $signature:artisanコマンドとして登録するときの識別子
- $description:コマンドの説明
- handle:実際の処理を記述
となります。
とりあえずテストをしようと思うのですが、何もこのままでは実行されないので下記のようにhandleにHello Worldを表示するように記述します。
public function handle()
{
echo "Hello World!";
return Command::SUCCESS;
}
次に実行名を変更します。command:はとらないようにしましょう。
取ると、php artisan listでコマンド一覧に表示されなくなります。
protected $signature = 'command:TestBatch';
これで下記のコマンドで実行できるようになります。
php artisan TestBatch
コマンドラインにHelloWorldが表示されれば成功です。
タスクをスケジュールする
次に上記で作ったバッチを、定時で実行できるようにします。
タスクスケジュールの内容はapp/Console/Kernel.phpのschedule()関数内に記述します。
初期だとkernel.phpは下記のようになっているはずです。
<?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');
}
}
上記のクラスファイルのcommandに実行したいバッチのクラスを追記します。
protected $commands = [
\Commands\〇〇Batch::Class,
];
あとはsheduleに実行するタイミングを記載するだけです。
月に1回定時で実行する場合は下記のように書きます。
protected function schedule(Schedule $schedule)
{
$schedule->command('〇〇Batch')->monthlyOn(1, '12:00'); // 毎月1日の12時に実行
}