Laravel

Laravelで定期実行(スケジューラー)を設定する方法

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

⇨ Laravel 記事の目次はこちら

Laravel で定期実行(スケジューラー)を設定する方法についてまとめています。

環境

Laravel Framework 8.60.0

最初に

Laravel のスケジュール設定については、

ドキュメントのここ

に書いてありますが、この記事では必要最低限の設定について書いています。

コマンドは事前に作られている前提です

コマンドを作る方法についてこちらの記事をご覧ください

⇨ こちらの記事

スケジューラーの設定方法

App\Console\Kernel.php の編集

schedule 関数に記述することで定期実行が可能です。

コマンドは、⇨ こちらの記事で作ったものをそのまま利用しています。

    protected function schedule(Schedule $schedule)
    {
        //1時間ごとにコマンドを発動する
        $schedule->command('asitakara-ganbaru')->hourly();
        //複数記述することも可能
        $schedule->command('asitakara-ganbaru')->daily();
    }

ローカルで定期実行のデバッグ方法

コマンドで

php artisan schedule:work

を起動させると、デバッグが可能です。

これは、次の項目でサーバーで設定することをローカル環境で実行してくれるコマンドになります。便利ですね。

サーバーにデプロイする時には、次の項目を参照してください。

サーバーに設定する必要がある

このスケジューラーの機能をざっくり説明すると、

php artisan schedule:run

というコマンドを 1 分ごとに行い、事前に記述した hourly()(1時間ごとに)などと時間を比較して、実行するしないを判断してくれています。

なので、サーバーの設定で 1 分に 1 回 php artisan schedule:run をしてもらう設定をする必要があります

こういったことをサーバーにお願いする機能で代表的なのが cron と呼ばれるものです。

サーバーや OS によってもともと入っているか?など導入方法は変わってくると思います。

例えば、AWS の EC2 だと最初から入っています。

以下 EC2 の例

EC2 だと

/etc/crontab

というファイルで設定が可能です。なので、vim で変更します。vim でファイルを開きます。

sudo vim /etc/crontab

開くとこのようになっています

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

そこに下記を追記します(EC2 の初期設定の場合 root ユーザーで実行するように書きます)

* * * * * root cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

path-to-your-project の部分には、github などからクローンした Laravel プロジェクトのディレクトリを指定します。

1 分に一回

「cd Laravel プロジェクトのディレクトリに移動」⇨「スケジュールラン」

しますよっていうコマンドを打ってもらうという記述になります。

最終系

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
* * * * * root cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

ローカルでのデバッグ方法

ローカルでは、cron を設定するのがめんどくさいので下のようなコマンドを用意してくれています。

php artisan schedule:work

このコマンドで、正しい時間に実行してくれるか確認してみてください

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

まとめ

以上です。

感想・苦情は TwitterDM にご連絡ください。

それでは!

人気記事

PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする

【laravel-breadcrumbs】Laravel でパンくずリストを実装する