Laravelでバッチ処理を実行するハンズオン

:::note 
<details><summary>AI要約</summary>

- Composerで新しいLaravelプロジェクトを作成し、php artisan serveでローカルサーバを起動。
- php artisan make:command SampleBatchでバッチファイルを作成。
- 作成されたSampleBatch.phpでコマンド名、説明、処理ロジックを設定。
- php artisan listでバッチコマンドがリストに表示されることを確認。
- php artisan batch:sampleでバッチを実行し、Kernel.phpでスケジュール設定を追加。

</details>
:::


## はじめに
今回はLaravelのバッチ処理を作ってから実行するまでの方法を記事にしてみました。
業務でバッチ処理を書きましたが「そういえば記事にしてないな」と考えて投稿してみた次第です。

それでは、Laravelプロジェクトでバッチ処理を実行する方法をステップバイステップで説明します。

## 1.  Laravelプロジェクトの作成と環境構築
- 必要なもの
- PHP 7.4以上
- Composer
- Laravelが動作するためのローカルサーバ（Laravelの内蔵サーバを使用）

まず、Composerを使って新しいLaravelプロジェクトを作成します。

```sh
composer create-project --prefer-dist laravel/laravel my-batch-app
cd my-batch-app
```

プロジェクトが作成されたら、Laravelに内蔵されている簡易サーバを使ってアプリケーションを立ち上げます。

```sh
php artisan serve
```

ブラウザでhttp://localhost:8000にアクセスして、Laravelのウェルカムページが表示されれば成功です。

## 2. バッチファイルの作成
次に、Laravelのコマンドを使ってバッチファイルを作成します。

```sh
php artisan make:command SampleBatch
```

このコマンドを実行すると、app/Console/CommandsディレクトリにSampleBatch.phpというファイルが生成されます。

## 3. 作成されたクラスの説明
生成されたSampleBatch.phpファイルを開いてみましょう。ファイルの内容は以下のようになっています。

```php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SampleBatch extends Command
{
     /**
     * The name and signature of the console command.
     *
     * @var string
     */
     protected $signature = 'batch:sample';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Sample batch command for demonstration';

    /**
     * Execute the console command.
     */
    public function handle()
    {
    }
}

```

以下の要素について詳しく見ていきます。

### コマンドの名前（ターミナルで使うもの）
```php
protected $signature = 'batch:sample';
```
これはこのコマンドを実行するためのコマンド名です。ここではbatch:sampleと設定されています。

### コマンドの説明
```php
protected $description = 'Sample batch command for demonstration';
```
これはコマンドの説明です。この説明は、php artisan listコマンドで確認できます。

### バッチ処理のメインロジック
```php
public function handle()
{
}
```

バッチ処理のメインロジックを記述する場所です。

### 作成したバッチコマンドの確認
次に、作成したバッチコマンドがリストに表示されていることを確認します。

```sh
php artisan list
```

以下はphp artisan listの実行結果の一部です。
```sh
Laravel Framework 8.x-dev

Usage:
  command [options] [arguments]

Available commands:
  clear-compiled        Remove the compiled class file
  help                  Display help for a command
  inspire               Display an inspiring quote
  list                  List commands
 batch
  batch:sample          Sample batch command for demonstration  <-- 作成したバッチコマンド
 cache
  cache:clear           Flush the application cache
  cache:forget          Remove an item from the cache
  cache:table           Create a migration for the cache database table
 config
  config:cache          Create a cache file for faster configuration loading
  config:clear          Remove the configuration cache file
 db
  db:seed               Seed the database with records
  db:wipe               Drop all tables, views, and types
...
```
上記のように、batch:sampleというカスタムバッチコマンドがリストに表示されていることが確認できます。

### 4. バッチ処理のテストプログラム
それでは、実際にhandleメソッドに処理を追加してみましょう。
```php
public function handle()
{
    $this->info('Sample batch executed successfully!');
    // ここにバッチ処理のロジックを追加
}
```

### 5. バッチの実行
バッチ処理を実行してみます。
```sh
php artisan batch:sample
```
正しく実行されると、以下のようなメッセージが表示されます。
```sh
Sample batch executed successfully!
```

## 6.  バッチの運用設定
実際のユースケースでは、バッチ処理を定期的に実行したり、特定のタイミングで実行することが求められます。Laravelでは、これをスケジュール設定で実現できます。

`app/Console/Kernel.phpを開き、scheduleメソッドにバッチコマンドを追加します。
```php
protected function schedule(Schedule $schedule)
{
    $schedule->command('batch:sample')->daily();
}
```
この例では、バッチ処理が毎日実行されるように設定されています。他にも、以下のような設定が可能です。

- `->hourly()`: 毎時
- `->weekly()`: 毎週
- `->monthly()`: 毎月

以上で、Laravelプロジェクトでバッチ処理を実行するためのハンズオンは完了です。この記事を参考に、あなたのプロジェクトでもバッチ処理を活用してみてください。

## さいごに
今までバッチはシェルスクリプトで書いて`cron`で定期実行していたのですがメインプロジェクトがLaravelで動いていたらバッチも同じようにLaravelで書いた方が楽ですね。
スケジュール実行できるのも驚きです。もうバッチ開発はLaravelだけで良いのかもしれませんね（これは過言かもしれませんが）

## 参考文献
https://laravel.com/docs/11.x/artisan

https://qiita.com/hinako_n/items/fc10ad4ae4c16a06bce0#%E6%89%8B%E9%A0%86%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B