調査した限りだと以下の3つの方法があるみたいです。
-
exec()
を利用する -
$this->call()
を利用する -
Artisan::call()
を利用する
それぞれの実装方法と実行結果を比較してみました。
実行速度に関しては厳密に計測したわけではなく、体感的なものになります。
実行環境
mac
PHP 7.1.13
Laravel Framework 5.5.28
実装方法
exec() を利用する場合
exec関数はphpの関数で外部コマンドを実行する関数です。
http://php.net/manual/ja/function.exec.php
なので、別のartisan実行の度にphpの別プロセスを動かすことになります。
非常に実行が重いです。
第2引数と第3引数に変数を入れると(参照渡ししています)変数に実行結果が代入されます。
詳しくはphpの公式ドキュメントをご確認ください。
exec('php artisan command:called --path=exec');
$this->call()
を利用する場合
こちらはLaravelのCommandクラスにで定義されているcallメソッドを利用します。
利用するには単純にメソッドを呼び出すだけです。
$this->call('command:called', ['--path' => 'call']);
また、この方法で実行すれば新たに呼び出したコマンドに関してもinfoやerror等のlaravelのコマンド用の出力されます。
Artisan::call()
を利用する場合
laravelの公式ドキュメントに記載してある方法です。
こちら方法を使えばコマンドだけでなくどこからでもartisanを呼び出せます。
use \Artisan;
// 実行
Artisan::call('command:called', ['--path' => 'artisan']);
戻り値は成功が0、失敗が-1になります。
実行速度はcallの場合とそれほど変わりませんでした。
この方法で実行した場合新たに呼び出したコマンドに関しての出力は表示できません。
おそらくですが、コマンドとして実行されない場合(webからのリクエストから実行するetc)を考慮している関係で出力されないのかもしれません。
結論
個人的には$this->call()
が速度、利便性から一番いいと思います。
以下が比較した表です。
種別 | 実装コスト | 実行速度(体感) | 呼び出しコマンドの出力 |
---|---|---|---|
exec() を利用する |
低い | 遅い | ある |
$this->call() を利用する |
低い | 早い | ある |
Artisan::call() を利用する |
低い | 早い | ない |
比較した時に使ったコードをgistに上げておきます。
https://gist.github.com/orange634nty/85921162d45fa51862befa4916553b99
ただしwebから実行するにはArtisanを使う必要があります。