🙌

Laravel バッチ処理を作成する

2022/02/10に公開

LaravelでWebアプリを作成している時、通知メールの実装などでバッチ処理を書くことがあると思います。
今回はLaravelでのバッチ処理の作成方法を解説していきたいと思います。

バッチ処理の実行

LaravelではArtisanが提供するコマンドに加え、独自のカスタムコマンドを作成することができます。作成されたコマンドはapp/Console/Commandsディレクトリに保存します。

コマンドの生成

php artisan make:command SendEmails
Console command created successfully.

このコマンドを実行することにより、Commandsディレクトリに新しいコマンドクラスを作成されます。
作成されたコマンドがこちら↓

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'メールを配信する。';

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

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        return Command::SUCCESS;
    }
}

signatureでコマンドの名前と使い方を英数字で設定し、descriptionでコマンドの実行内容について日本語で記載できます。

続いてhandle function内でコマンド実行内容を書いていきます。
おすすめとしてはこのconsoleコマンド内ではコードは軽くして、アプリケーションサービスで処理を書き、コマンド内で呼び出す形の方がコードの再利用を増やせるため良いです。

まずはアプリケーションサービスにコントローラを作成しましょう。

php aritsan make:controller Api/SendMailController
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Carbon\Carbon;

class SendMailController extends Controller
{
    /**
     * send mail
     *
     * 
     */
    public function sendMail()
    {
	 //メールの配信処理
 
    }
}

アプリケーションサービスで記述したfunctionは以下の方法で呼び出せます。

app/Console/Commands/SendEmails.php

  /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $send_email_controller = app()->make('App\Http\Controllers\Api\SendEmailController');  ←追加
        $send_email_controller->sendEmail(); ←追加

        return SUCCESS;
    }

コマンドの作成ができたら以下ファイルでコマンドの登録をします。
app/Console/Kernel.php

    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\SendEmails::class, ←追加
    ];
 /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('command:sendEmails')->everyTenMinutes();←追加
    }

ここでeveryTenMinutes()などで何分、何時間おきに処理を実行するか設定することができます。
他にも
・everyMinutes() :毎分
・hourly() :毎時間
・daily() :毎日深夜12時
など様々な時間のスケジュールがあります。

ここまででコマンド実行をすることができます。

$ php artisan command:sendEmails
何かしらの処理が走る

cronの設定

MacOSにてcrontabを起動する時はこのコマンドで起動することができます。
terminal

$ crontab -e

初めてcrontabを起動する時は何も記述されてないためこのような形で起動されます。

ここにバッチ処理を登録します。

00 * * * * php artisanまでのパス/artisan command:sendEmails

これでスケジューラで設定した通り、10分毎にバッチが走るようになりました。

まとめ

今回はLaravelでのバッチ処理の方法とバッチ処理の登録方法を説明しました。
何分か毎に自動で処理が実行されるはすごい便利だと思うので、参考にしてみてもらえればと思います。

Discussion