TaskSchedulingでスケジュール設定。つまづいたとこなど。

Laravel

アップロードしたファイルを、古くなったものから自動で削除してくれたらいいな〜と思って調べたところ、Laravelでは簡単にスケジューリングできる機能があるとのこと。

さっそく使ってみたので、詰まった箇所と合わせてメモしておきます。

Laravel側の設定と、PC側の設定がある

このスケジュールを設定するにあたり、コマンドを実行する時間・頻度を設定する箇所が2つ出てきます。

Karnel.phpで毎分、1時間ごと、など細かく設定しているのに、またcrontab内で* * * * * こういう記号とともに頻度を設定しないといけない。

何で???

Laravel側での設定と、PC側での設定をそれぞれ書かないといけなくて、それぞれに役割が違うようです。そのことが分かるまで、???でした。

Laravel側の設定

基本的には app/Console/Karnel.php 内を編集してスケジュール設定をします。

が、記述が増えたりすると保守性が下がるので、別ファイルにクラスにとして切り分けて、それをKarnel.phpにて読み込むパターンが多く紹介されています。

ただ、最初は関連ファイルが増えるとややこしくなるので、Karnel.phpだけを触って動きを確認した方がいいかもです。

記述の方法はいくつかあります。参考サイト様を貼っておきますね。

こちら(Qiita)

こちらもおすすめ(いつもお世話になっているconsole.log様)

1つだけ詰まった点

Karnel.phpに記述を進めていって、さて頻度を設定しよう!と思ったとき

$schedule->command()->daily();

のように書くよ!と解説されている場合が多いです(Laravel本家サイトでも)。

でも私はcommand()じゃなくてcall(function() {……という書き方をしていて、command無いやん!どこに->daily();つければいいの??

としばし迷いました。結果的には

$schedule->call(function() {
  //略
})->daily();

と普通に書けば良かったみたいです!

PC側の設定

Laravel側でファイルを正しく書いても、今回のスケジューラー機能を使うにはPC側の準備がないと動いてくれません。

Laravelで設定したスケジュール達を動かすために出てくるキーワード。

それが、cronやcrontab。

聞いたことあるような無いような単語で、コードを書いても最初何をしているのかよく分かりませんでしたが

要はLaravelプロジェクトを見に行ってスケジュールを実行する、その内容と頻度をPC側(crontab内に記述して)で設定するようです。

そして、スケジュールを実行されたLaravel側は、Karnel.php内の設定に基づいて動かすべきスケジュールがあれば実行する。という仕組み。

PC側の設定については次の項で。

crontab内の記述例

ここではメモ程度にしか書いていないので、詳しいcron設定については以下のサイト様が参考になります。

こちらとか

こちらとか

 crontab -e  で設定を記述

 crontab -e  

とターミナルに入力すると、crontabに書き込み・編集ができるようになります。

ここで記述すべき内容ですが、「Laravel スケジューラー」などで検索すると

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

このように記述するよう書かれていることが多いと思います。

cdコマンドでプロジェクトディレクトリへ行ってartisanコマンドを実行する。という意味ですが、最後の

/dev/null 2>&1

という記述はエラーも何も出力しない、という意味になります。

これがあるとコマンドに間違いがあっても何も表示されないので、何がどうなっているのか把握できません。

なので私は最後の >> /dev/null 2>&1 はまるっと消してしまって、実行結果を出力するようにしました。

 結果の出力は

crontabの実行結果は、デフォルトで /var/mail/{ユーザー名}で見ることができます。(設定で、出力先を変更するとこもできます)

ターミナルに

 cat /var/mail/hiro  //←最後のユーザー名は環境に合わせて変えてください

と入力すると、cronの実行結果が表示されます。エラーも表示されます。

自動実行する前に、手動実行で確認する

もちろん今回の場合、目指すは自動実行なのですが、動かないな〜と思ったときにKarnel側のコードが悪いのか?crontab側か?がわからないと大変です。

なのでcrontabで設定する前に手動で動かしてみて、その場でエラーを確認してみましょう。

いつも通りプロジェクトルートで

php artisan schedule:run

とすると、何らかの答えが返ってきます。これで先に動作確認してから、crontabで自動実行してみてください。

タイトルとURLをコピーしました