Posted at

LaravelのCommandを使う

ちょっと更新が滞ってしまったけど、過去ブログのQiitaへの移転シリーズ第5弾、今回はこの記事なのですが、当時使っていたのがLaravel5.2で、今は5.7(もう5.8リリースしたんだっけ)と大分時が経ってしまったのでちょくちょく修正していこうかと。

Webシステムと言っても、ブラウザから操作するだけでなく毎日(or毎週or毎月)、自動的に何かやってほしいことがあると思います。 例えば、毎年4月1日になったら学年を更新するとか。

そんな時に役に立つLaravelのコマンド(とcrontab)を紹介します。

やり方は、以下の流れになります。


1. artisanでコマンドを作成する

例えば、コマンドのクラス名をUpdateGradeという名前で作ることを考えます。

php artisan make:command UpdateGrade

注:5.2までは下記のコマンドになります。

php artisan make:console UpdateGrade

これによってapp/Console/Commands/UpdateGrade.phpが出来上がります。さらにオプションで"--command=コマンド名"とやると、実際に打つコマンド名を変えることができます。

例えば、実行するコマンド名をupdate_gradeとすると、

php artisan update_grade

でコマンドが実行できるようになります。


2. コマンドのプログラムを実装する

1.で出来たapp/Console/Commands/UpdateGrade.phpのファイルにソースコードを実装します。実際の処理の他にコマンドラインオプションもこちらで実装できます。詳細はこちらを参考にしてください。


3. カーネルに先ほどのコマンドのクラスを追加する

app/ConsoleにKernel.phpというファイルがあると思います。それのprotect $commands =の中に

Commands\UpdateGrade::class,

という記述を加えてください。以外と忘れがちです。

ここまで来たら、php artisan update_gradeと打つと作ったコマンドを動かすことができます。また、php artisan listと打つとatrisanで使えるコマンド一覧が表示されるのですが、その中にupdate_gradeも入っていることがわかると思います。


4. crontabに自動実行の設定を書き込む

 3.までで作ったコマンドを自動で実行できるようにするのがcrontabの役割です。まず、

crontab -e

と打ちます。

  そうするとエディタが出てくるので、それに設定の記述を追加します。詳細な書き方はこちらを見ていただくとして、1つ気をつけなければいけないのは、手動での実行時はphp artisan update_gradeだけでよかったのですが、crontabにはphpとartisanの絶対パスを書かなければいけないことです。

 例えば

  15 1 1 * * /usr/local/lib/php-7.1.23/bin/php /home/username/www/system/artisan update_grade

  という設定を書き込むと、毎月1日午前1時15分に今回作ったupdate_gradeコマンドが実行されるようになります。

 なお、crontabに設定されているコマンドの一覧はcrontab -lで見ることができます。

 これを使って、結構いろいろなことができそうですね。例えば毎月1回いらないファイルを削除するとか。ぜひ使い方をマスターしたいものです。