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
このコマンドで、正しい時間に実行してくれるか確認してみてください
まとめ
以上です。
感想・苦情は TwitterDM にご連絡ください。
それでは!
人気記事