例えばPHPスクリプトをコマンドから実行するときに、
- コマンドライン引数を調べたい
- オプションとかも取得したい
こういうことって多くはないけど、必要な場面があると思います。
そこでPHP内でコマンド引数とかオプションを受け取る方法&コード例をまとめました。
自分自身もやり方を忘れがちなので、その忘備録も兼ねて紹介します。
コマンド引数を受け取ること自体は簡単
ではまずコマンド引数を受け取る方法について
そのやり方は簡単で、次の2つのどちらかを参照すればOK
- $_SERVER['argv']
- $argv
この2つのどっちかを使えば、コマンド引数を連想配列で受け取れます。
ちなみに Cron でphpスクリプトを自動実行してる場合でも参照可能 です。
実際のコード例とか取得方法は次の通り
例えば
xxx.php というファイルを作って、
そこに次みたいにコマンド引数を全部表示するスクリプトを書いたとします。
1 2 3 4 5 |
/// コマンドライン引数を表示 var_export( $_SERVER['argv'] ); /// ▼ こういう書き方でもOK //var_export( $argv ); |
そしてこの xxx.php をコマンドから実行( php へのパスは通してるものとする)
1 |
php xxx.php hoge fuga piyo |
そうするとスクリプトの出力はこうなります。
1 2 3 4 5 6 |
array ( 0 => 'xxx.php', 1 => 'hoge', 2 => 'fuga', 3 => 'piyo', ) |
上の出力を見ればわかるように、php自体は引数に含まれません。
phpの後に続く引数が配列として参照できます。
以上がPHPでコマンド引数を取得する方法
先ほども書いたみたいに、次の2つから参照可能です。
- $_SERVER['argv']
- $argv
まあどっちを使ってもいいですが、自分は $_SERVER['argv'] を使うことが多いですね。
あと $argc を参照すれば引数の個数だけ求めることもできます。
コマンド引数のオプションを調べるには
お次はコマンドライン引数のオプションを調べる方法について
こっちは getopt 関数を使えば、色々取得可能です。
取得できるオプションの種類は次の2つ
- "-y" みたいな1文字だけのオプション
- "--hoge" みたいな複数文字列のオプション
この2つではオプション値の取得方法も違うので、別々に紹介してきます。
-x みたいな1文字オプションを取得する方法
まずは -y -m -d みたいな1文字だけで構成されるオプションについて
1文字だけの場合は、
getopt 関数の第1引数に取得したいオプションを文字列で渡して取得します。
例えば次みたいなコマンド付きで xxx.php を実行したとしましょう。
1 |
php xxx.php -y2019 -m05 -d29 |
上の -y2019 -m05 -d29 がオプションの部分
このコマンドの、
- オプション名( -y とか -m とか -d )
- オプション値( 2019 とか 05 とか 29 )
この両方を取得したい場合次コードを書けばOK
1 |
var_export( getopt('y::m::d::') ); |
上コードの出力例は次みたいになります。
1 2 3 4 5 |
array ( 'y' => '2019', 'm' => '05', 'd' => '29', ) |
オプション名と値がペアになって表示されてるのが分かるはず
これが ハイフン + 1文字 だけのオプションを取得する方法です。
ちなみに、さっきのコードだとオプションの後に :: がありましたよね?
1 |
var_export( getopt('y::m::d::') ); |
このコロンの数というのは値の受け取り方を指定するものです。
その状態というのはコロンの数によって変わり、
- コロン1つ( : ) => 値はなくてもいい
- コロン2つ( :: ) => 値は必須
- コロンなし() => 値を一切受け付けない
こういう風にコロンの数によって値を受け取ったり、逆に拒否できます。
--year みたいな文字列のオプションを取得する方法
お次は1文字じゃなくて複数文字で成り立つオプションを調べる方法について
その場合は getopt の第2引数に調べたいオプションの配列を渡せばできます。
例えば xxx.php を次のコマンド付きで実行するとしましょう。
1 |
php xxx.php --year="2019" --month="05" --day="29" |
この場合だと
--year とか
--month がオプション名、
ダブルクォートで囲まれた
"2019" とか
"05" がオプション値になります。
これを取得して表示するのが次のコード
1 2 3 4 5 6 |
$longopts = [ 'year::', 'month::', 'day::' ]; var_export( getopt(null, $longopts) ); |
そして上コードの出力結果は次の通り
1 2 3 4 5 |
array ( 'year' => '2019', 'month' => '05', 'day' => '29', ) |
こっちもオプション名とオプション値が取得できました。
ちなみにコロンの数によって値を受け取ったり、拒否できるのは1文字オプションと同じです。
まとめ
ここまでを簡単にまとめると次の通り
- コマンドライン引数を受け取る
定義済みの $_SERVER['ARGV'] または $argv を参照
- 単体文字オプションを受け取る
getopt関数に "y::m::d::" みたいなオプションを並べた文字列を渡すことで取得可能。ただし、オプション名の後のコロンの数に応じて値の受け取り方が異なる
- 文字列オプションを受け取る場合
getopt関数の第2引数にオプション名を並べた配列を渡すことで取得可能。ただし、オプション名の後のコロンの数によって値の受け取り方が異なる(単体文字と同じ)
以上、PHPでコマンドライン引数とかオプションを調べる方法でした。ではでは