laravel コマンドラインで実行したい(タスクスケジューリング, artisan make:command)
cronで何かさせたいときや、ちょっとした確認でコマンドラインで実行したいときがある
作成日:2024-08-01, 更新日:2024-08-01
やりたいこと
- コマンドラインで実行したい
- cronで定時実行したい
手順
- 実行させるファイルを作成
- コマンドで手動実行
- 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なら初期値セット
// 省略
}