アップロードしたファイルを、古くなったものから自動で削除してくれたらいいな〜と思って調べたところ、Laravelでは簡単にスケジューリングできる機能があるとのこと。
さっそく使ってみたので、詰まった箇所と合わせてメモしておきます。
Laravel側の設定と、PC側の設定がある
このスケジュールを設定するにあたり、コマンドを実行する時間・頻度を設定する箇所が2つ出てきます。
Karnel.phpで毎分、1時間ごと、など細かく設定しているのに、またcrontab内で* * * * * こういう記号とともに頻度を設定しないといけない。
何で???
Laravel側での設定と、PC側での設定をそれぞれ書かないといけなくて、それぞれに役割が違うようです。そのことが分かるまで、???でした。
Laravel側の設定
基本的には app/Console/Karnel.php 内を編集してスケジュール設定をします。
が、記述が増えたりすると保守性が下がるので、別ファイルにクラスにとして切り分けて、それをKarnel.phpにて読み込むパターンが多く紹介されています。
ただ、最初は関連ファイルが増えるとややこしくなるので、Karnel.phpだけを触って動きを確認した方がいいかもです。
記述の方法はいくつかあります。参考サイト様を貼っておきますね。
こちらもおすすめ(いつもお世話になっている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で自動実行してみてください。