ブログ
 

Laravelのタスクスケジュールで定期処理を自動実行

       

本日は、Laravelのタスクスケジュールを使って定期的な処理を実行する方法についてまとめます。

バージョン

Laravel 8.X

はじめに

Laravelで定期的な処理を実行したい場合、タスクスケジュールを利用することで、シンプルに実装することが可能です。通常Linux系のOSで定期的な処理を実行する場合、タスク毎にCronエントリーを追加します。LaravelもCronを利用しますが、Cronエントリーの追加は一つだけで済みます。各タスクの管理はLaravel側で行うため、タスクの追加を効率よく行うことができます。

スケジューラを使いはじめる

スケジューラを使うには、サーバーに下記のようなCronエントリーを追加します。

* * * * * cd [プロジェクトのパス] && php artisan schedule:run >> /dev/null 2>&1

このCronエントリーは、スケジューラを毎分呼び出し、その時点で実行する必要のある処理を行います。

ローカル環境でCronを使えない、使いたくない場合

Laravel 8.X以降は、下記のコマンドを使用することで、Cronがなくとも動作確認が行えます。

$ php artisan schedule:work

スケジューラの定義

タスクスケジュールはapp/Console/Kernel.phpのschedule()関数内に記述します。下記はKernel.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');
    }
}

今回はartisanコマンドを作成し、タスクスケジュールに登録してみます。

artisanコマンドの作成

$ php artisan make:command WriteLog

コマンドはapp/Console/Commandsに作成されます。ここでは動作確認のためWriteLogというクラスを作成しています。下記はWriteLog.phpのデフォルトの内容です。

namespace App\Console\Commands;

use Illuminate\Console\Command;

class WriteLog 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;
    }
}

$signatureにはコマンドの名前を入れます。

    protected $signature = 'writelog';

$descriptionにはコマンドの説明を入れます。

    protected $description = 'ログ出力';

handle()内には処理内容を記述します。ここではヘルパー関数logger()を使用し、ログを出力する記述しています。

    public function handle()
    {
        logger('test');
    }

artisanコマンドの登録

コマンドを作成しましたが、実行できるようにするためにはコマンドの登録が必要です。app/Console/Kernel.phpの$commands変数にコマンドを登録します。

    protected $commands = [
        Commands\WriteLog::Class,
    ];

artisanコマンドの実行

$ php artisan writelog

実行するとstorage/logs/laravel.logに下記のログが出力されます。

[XXXX-XX-XX XX:XX:XX] local.INFO: test

タスクスケジュールの登録

最後に、作成したコマンドをタスクスケジュールに登録します。app/Console/Kernel.phpのschedule()関数内に下記の内容を記述します。ここでは、動作確認のため毎分実行しています。

    protected function schedule(Schedule $schedule)
    {
        $schedule->command('writelog')->everyMinute();
    }

ログを見ると、毎分実行されていることが確認できます。

[XXXX-XX-XX XX:00:XX] local.INFO: test
[XXXX-XX-XX XX:01:XX] local.INFO: test
[XXXX-XX-XX XX:02:XX] local.INFO: test
[XXXX-XX-XX XX:03:XX] local.INFO: test
[XXXX-XX-XX XX:04:XX] local.INFO: test

まとめ

今回はログを出力するだけの簡単な内容でした。ここまでお読みいただきありがとうございました。

Laravel 8.x タスクスケジュール

 
  • このエントリーをはてなブックマークに追加