【Laravel】バッチ処理の作り方とスケジューリングの実践方法

【Laravel】バッチ処理の作り方とスケジューリングの実践方法 Laravel

Laravelでは、定期的な処理やバックグラウンドでの自動実行処理を「バッチ処理」としてコマンド形式で作成し、スケジューラを通じて自動化することができます。本記事では、Artisanコマンドを使ったバッチ処理の作成方法と、スケジューリングを用いた定期実行の設定方法までを詳しく解説します。

Laravelのバッチ処理とは?

Laravelのバッチ処理は、Artisanコマンドとして実装されます。これは、CLI(コマンドライン)から呼び出せる処理の単位であり、データの集計、通知の送信、レポートの生成など、あらゆる定期処理に活用可能です。

バッチコマンドの作成方法

まず、Artisanコマンドを作成するには以下のコマンドを使用します。

php artisan make:command SampleBatchCommand

このコマンドで、app/Console/Commands/SampleBatchCommand.php が生成されます。

生成されたクラスの主要部分は以下のようになっています。

class SampleBatchCommand extends Command
{
    protected $signature = 'batch:sample';
    protected $description = 'サンプルのバッチ処理を実行します';

    public function handle()
    {
        // 処理内容を記述
        \Log::info('バッチ処理を実行しました');
        $this->info('バッチ処理完了');
    }
}

このバッチ処理は、ターミナル上で以下のように実行できます。

php artisan batch:sample

handle()メソッド内に、任意の処理(データ更新、メール送信など)を記述するだけでバッチ処理が完成します。

バッチコマンドのスケジューリング設定

作成したバッチ処理を自動実行するには、Laravelのスケジューラー機能を使います。設定はapp/Console/Kernel.phpのscheduleメソッド内で行います。

protected function schedule(Schedule $schedule)
{
    $schedule->command('batch:sample')->dailyAt('02:00');
}

上記の設定では、毎日午前2時にbatch:sampleコマンドが実行されます。

他にも以下のようなスケジューリングオプションが用意されています。

  • ->hourly():1時間ごと
  • ->daily():毎日午前0時
  • ->weekly():毎週日曜日
  • ->cron(‘*/5 * * * *’):5分おき(cron形式)

サーバー側のcron設定

Laravelのスケジューラーは、サーバーのcronで1分おきにartisan schedule:runを実行することで動作します。Linuxサーバーでの設定例は以下の通りです。

* * * * * cd /path/to/laravel && php artisan schedule:run >> /dev/null 2>&1

このcronジョブは、Laravelのスケジューラーを毎分起動し、スケジュールされたコマンドがあれば実行します。

スケジュール処理のログ記録と通知

バッチ処理の成功・失敗を追跡するために、ログや通知機能を組み合わせることが可能です。例えば、バッチ処理内でログを出力するには以下のように記述します。

\Log::info('ユーザーデータの更新を完了しました');
\Log::error('処理中にエラーが発生しました');

また、Slackやメールなどへ通知するには、スケジューラーのメソッドに->emailOutputTo()や->sendOutputTo()を指定できます。

$schedule->command('batch:sample')
    ->daily()
    ->sendOutputTo(storage_path('logs/batch_output.log'))
    ->emailOutputTo('admin@example.com');

複数バッチ処理をグループ化する方法

複数の処理を順番に実行したい場合は、call()メソッドで関数ベースのバッチ処理を定義することも可能です。

$schedule->call(function () {
    // 一連の処理をここに記述
})->dailyAt('03:00');

または、複数のコマンドを連続して呼び出すような制御構造を構築することもできます。

まとめ

Laravelでは、Artisanコマンドを用いたバッチ処理とスケジューラーによる自動実行を非常に簡単に構築できます。手動で行っていた処理を自動化することで、開発効率や運用の安定性を向上させることができます。

本番環境での利用時は、実行タイミングやログ管理、通知設定などにも気を配ることで、信頼性の高いバッチ運用が実現できます。