laravelでバッチ処理を実行・タスクをスケジュール化する。

php/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時に実行
    }