laravel コマンドラインで実行したい(タスクスケジューリング, artisan make:command)

cronで何かさせたいときや、ちょっとした確認でコマンドラインで実行したいときがある

作成日:2024-08-01, 更新日:2024-08-01

やりたいこと

  • コマンドラインで実行したい
  • cronで定時実行したい

手順

  1. 実行させるファイルを作成
  2. コマンドで手動実行
  3. cronで自動実行

実行させるファイルを作成

ファイル作成

▼artisanコマンドでcommandをセットする

$ php artisan make:command hoge

→「app/Console/Commands/hoge.php」

▼artisanコマンドでcommandをセットする: フォルダ設定

$ php artisan make:command hoge/foo

→「app/Console/Commands/hoge/foo.php」が作られる

コマンドクラス(ファイル)の修正

  • $signature - コマンドラインで実行するときの設定
  • handle() - やりたいことを記述

コマンドの確認

$signatureの設定が反映されているか確認

$ php artisan list

コマンドで手動実行

「$signature」を「hoge:foo」と設定している場合

$ php artisan hoge:foo

cronで自動実行

タスクスケジューリング…ってのがlaravelには用意されている
「app/Console/Kernel.php」に処理を追加すればいい…けど普通にcronで実行で良いかなぁ…

タスクスケジューリングってのを使う場合、「app/Console/Kernel.php」に「schedule()」を追加

  • 「schedule()」内で実行したいコマンドをセットしていく
  • 「php artisan schedule:run」とするとセットしたものをすべて実行してくれる
  • cronの設定は「php artisan schedule:run」の一つだけでOK

…実行したいコマンドをすべてcronに設定…のほうが後々ラクそうなので、これ以上は未調査

タスクスケジューリングを使う場合

cronでの設定は「schedule:run」ってヤツを実行させる

* * * * * cd [artisanのあるPATH] && php artisan schedule:run >> /dev/null 2>&1

タスクスケジューリングを使わない場合

* * * * * cd [artisanのあるPATH] && php artisan hoge:foo >> /dev/null 2>&1

実行したいコマンドが複数ある場合は、すべてcronにセットする

引数を渡したいとき

コマンド例

$ php artisan hoge:foo 'aaaa' 'bbb'

コマンドクラス(ファイル)例

// 省略
protected $signature = 'hoge:foo {arg_a} {arg_b?}'; // 「?」で引数無しでもOKとする
// 省略
public function handle() {
  $arg_a= $this->argument('arg_a');
  $arg_b= $this->argument('arg_b') ?? 'init_val'; // nullなら初期値セット
  // 省略
}