[PHP] CLIで利用する時にクエリ情報を便利に取得する方法

コマンドラインで事前に用意していたプログラムを実行する際や、サーバー運用などで便利ツールを作っておいた場合に
引数を渡して柔軟なツールにする必要がありますが、PHPであれば「argv」情報を取得して行う方法と「getopt」関数を使って受け渡しの値を取得する方法があります。
どの方法が最適化は状況に応じて使い分けるとして、2パターンのやり方をメモしておきます。
argv
PHPのCLIで受け取ることのできるARGV情報はコマンドライン情報の実行プログラムを含めた値全てをスペース区切りで配列で受け取る事ができます。
1 2 |
<?php print_r($argv); |
下記のように実行した場合、
1 2 3 4 5 6 7 8 |
$ php argv.php aaa bbb ccc Array ( [0] => argv.php [1] => aaa [2] => bbb [3] => ccc ) |
$argvの配列で取得すればいいので、順番固定の仕様であれば簡単に使うことができる。
ただし、URLクエリのように、key=valueの連想配列で受け取りたい場合は、以下のようにすればいい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php if(!isset($_SERVER['SCRIPT_URI']) && isset($argv)){ for($i=0,$c=count($argv);$i<$c;$i++){ if(!$argv[$i]){continue;} //各クエリの分解 $q = explode("=",$argv[$i]); if(count($q)<2){continue;} if($q[0]!=''){ //requestに格納 $key = $q[0]; $val = join("=",array_slice($q,1)); $_REQUEST[$key]=$val; } } } print_r($_REQUEST); |
実行結果
1 2 3 4 5 6 7 |
$ php argv_hash.php a=aaa b=bbb c=ccc Array ( [a] => aaa [b] => bbb [c] => ccc ) |
順位不同で実行できるので実用的です。
さらにCLI以外でも使えるように$_REQUESTに値を入れているので、ハイブリッドに使えます。
getopt
コマンドラインでよくある「-a」や「-v」などのような受け渡しでできるのがこの関数です。
詳しい使い方はPHP Manualを参照
設定は少し複雑な面もあり、
「-a」「-v」のようなshortオプションと
「–all」「–version」のようなlongオプションが存在する。
どちらを使ってもいいし、多くのコマンドでハイブリッドにしている事も考えると、コマンド設計が重要になると言える。
とりあえず、ここでは簡易な使い方のみサンプルで用意しました。
1 2 3 4 5 6 7 8 9 10 11 |
<?php //$options = getopt("a:hl"); $short = "a:v:"; $long = array( "all:", "version:" ); $options = getopt($short,$long); print_r($options); |
実行結果
1 2 3 4 5 6 7 8 |
$ php getopt.php --all test -a aa -v vv --version 1.2 Array ( [all] => test [a] => aa [v] => vv [version] => 1.2 ) |
オプション設定はshortもlongも”:(コロン)”をつけるのがポイントのようです。
この設定はあまり他ではないので、少し特殊ですね。
マニュアルページを見ると、もう少し細かな設定などが出来るようですが、今回はここまで。