Laravelのタスクスケジュールについて勉強した

2021/03/28に公開

とあるサイトを作っているときに、特定の時間になったら自動的に処理を実行する処理がどうしても必要になりました。
所謂バッジ処理というやつです。
バッジ処理とは簡単に言うと登録した一連の処理を自動的に実行する事です。
詳しくはここで。

Laravelではこの処理を実現するためにタスクスケジュール機能がありますのでこれを使います。
タスクスケジュール
正直ドキュメントを見ればある程度分かるのでこの記事を読まなくていいかもです。

さてさて、Laravelのタスクスケジュールの使い方です。
Laravelでは自動的に実行する処理をKernel.phpに書きます。

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Facades\Log; // ログを表示する場合

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
	'App\Console\Commands\CommandTest' // コマンドのパスを書く
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
	$schedule->command('command:test') // 実行するコマンドの名前
        ->dailyAt('9:00') 
        ->onSuccess(function () {
            Log::info('成功');
        }); // 日時を指定する処理などを書く。
    }



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

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

僕の場合コマンドを用意して、それを登録して実行しています。

CommandTest.phpというファイルを用意する、

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Quiz;

class TimeQuiz extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:test'; // コマンドのの名前を設定

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'CommandTest';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
       // ここに自動化したい処理を書く。
    }
}

コマンドを書いたら、cronを設定します。
コマンドプロントでsudo crontab -eを実行しvimファイルで開きます。
キーボードのiで編集モードにして以下のように修正します。

* * * * * cd /user/~(プロジェクトのパスを書く) && php artisan schedule:run >> /dev/null 2>&1

Escで編集モードを終了し、:wqで保存して終了します。
んで、実行する時間や日付に関しては->everyMinute();や->daily();を使用します。
とりあえず毎分実行の->everyMinute();にしとけば確認しやすい。

コマンド+スケジュールの場合、キャッシュに保存するやり方が便利。

$test = Model::with('~~')
            ->inRandomOrder()
            ->get();

cache()->forever('~~~', $test);

後は、コントローラーで$test = cache('~~~');を書いておけばいつでも使うことができる。

最後にphp artisan schedule:runを実行してタスクスケジュールを起動して終わりです。

Discussion