😺

【Laravel】 バッチ処理機能を実装する

2021/05/08に公開

この記事を読んでわかること

  • artisanコマンドの作成方法
  • artisanコマンドを意図した時間に自動実行する方法
  • crontabファイルの記載の仕方

使用環境

  • Laravel 5.5.49
  • PHP 7.1.29

全体の流れ

  1. artisanコマンドの作成
  2. artisanコマンドの登録
  3. crontabに登録

artisanコマンドの作成

$ php artisan make:command HogeBatch

コマンド実行で、app/Console/CommandsにHogeBatch.phpが作成されます。

ファイルの中身と記述内容に関しては以下に記載します。

apop/Console/Commands/HogeBatch.php
 <?php

 namespace App\Console\Commands;

 use Illuminate\Console\Command;

 class HogeBatch extends Command
 {
     /**
      * The name and signature of the console command.
      *
      * @var string
      */
     protected $signature = 'batch:hoge';//artisanで呼び出すときのコマンド名。

     /**
      * The console command description.
      *
      * @var string
      */
     protected $description = '説明文';//artisanコマンド一覧で表示される説明文。設定は任意。

     /**
      * Create a new command instance.
      *
      * @return void
      */
     public function __construct()
     {
         parent::__construct();
     }

     /**
      * Execute the console command.
      *
      * @return mixed
      */
     public function handle()
     {
        //実行したい処理の記載
     }
 }

artisanコマンドの登録

Laravel内でコマンドの管理を行いやすくするために、コマンドの登録をしておきます。

app/Console/Kernel.php
<?php

 namespace App\Console;

 use App\Console\Commands\HogeBatch;//追記
 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 = [
 ^   ^   HogeBatch:class,//追記
     ];

     /**
      * Define the application's command schedule.
      *
      * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
      * @return void
      */
 ^   //artisanコマンドの実行スケジュールを記述
     protected function schedule(Schedule $schedule)
     {
         //追記
         $schedule->command('batch:hoge')
                   ->everyMinute();//スケジューラーを記載

     }

     /**
      * Register the commands for the application.
      *
      * @return void
      */
     protected function commands()
     {
         $this->load(__DIR__.'/Commands');

         require base_path('routes/console.php');
     }
 }

スケジューラーに関しては公式ドキュメントを参照して下さい。

crontabに登録

crontabを開き、下記の一行を追加すると、登録したコマンドが設定したスケジューラーの時間ごとに実行されます。

$ crontab -e

* * * * cd プロジェクトのパス&&php artisan schedule:run 1>/プロジェクトのパス/normal.txt 2>/プロジェクトのパス/error.txt

crontabに記載した内容を解説します。

cd プロジェクトのパス //ディレクトリを移動

&&php artisan schedule:run //かつ、Laravelのスケジュールを実行

1>/プロジェクトのパス/normal.txt 2>/プロジェクトのパス/error.txt
//標準出力をnormal.txtに、標準エラー出力をerror.txtに出力するようにしています

標準出力、標準エラー出力、コマンドの意味については、いい加減覚えよう。 command > /dev/null 2>&1の意味が参考になりました。

以上でLaravelでのバッチ処理が実装が完了です。

参考記事

https://re-engines.com/2019/06/13/laravel-batch-processing/
https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea

Discussion