PHPでバッチ処理を書いている人は少なからずいると思います。
バッチ処理の実行はcronですが、何かするときにコマンドからプログラムを実行する事もあるでしょう。
実行する際に、引数を渡してプログラム内で使いたい!と思った事はありませんか?
私は今までそのような機会がなかったのですが、どうしても必要に迫られて引数の設定ができるのか調査したらできるとの事なので紹介します。
コマンドでの実行
まずは基本的なコマンドでの実行方法を見てみましょう。
# PATHを含めて実行する方法 $ php /home/example/example.php # /home/exampleに移動済みで実行する方法 $ php example.php
単純ではありますがまずはこれが基本になります。
では、引数をどうやって設定すればいいのか?ですが、思いつくのはGETパラメータにしたら渡したらできるでしょ!っていう考えになるかと思います。
だって、ブラウザではそれができるんですもん(笑)
GETパラメータを設定してみた
GETパラメータ方法で一度挑戦してみます。
// example.php echo $_GET['name'];
上記にはPHPで取得した値をechoしているだけです。
コマンドは下記で実行してみると…
$ php example.php?name=test Could not open input file: example.php?name=test
ん??
Could not open input file: example.php?name=test
な…なぜだ!!
ファイルが開けないだと!?と思ってもしょうがないんですけどね(笑)
じゃあ、どうすればいいのよ!!!という事ですがちゃんと方法あります。
正しく引数を設定する
ここからが本題です(笑)
ではどうやったら引数が渡せるのか?という事ですが、ここは単純に他のコマンドと同様の事をしてあげればいいだけですがPHPは他のSHELLとは違うので注意です。
$ php example.php test
// example.php echo $argv[1]; // test
PHPでは引数を「$argv」で取得する事ができます。
$argv[0]は常に実行スクリプト名が入りますので、$argv[1]から順番に取得する事になります。
うん…でも期待しているものと違う!!!
はい、言いたいことはわかりますよ。
順番に取得する事はわかったけど、パラメータとして設定したいんですよね??そうですよね!!!!
$ php example.php name=test
// example.php echo $argv['name']; // test
これが理想ですけど、実はできないんです。
仕様なのだからしょうがないのですが、もしかしたら順番がばらばらになって指定されちゃうかもしれません。
という事で!!!下記の関数みたいな感じで作っちゃいましょう!
// example.php function argvArray($argv) { $return = array(); foreach ($argv as $key => $item) { if ($key == 0) { continue; } list($param, $value) = explode('=', $item); $return[$param] = $value; } return $return; } $result = argvArray($argv); echo $result['name']; // test
$argvの値をforeachで回しexampleを使用して「=」で切り分けています。
引数でくる「=」は1つだけと想定しているのでこれで十分だと思います。
ほんのすこし手間はかかりますが、これでやりたい事が出来るようになりました。
コメント
getopt で良いのではないかと思います。
http://php.net/manual/ja/function.getopt.php
ありがとうございます!
getoptは初めて知りました。
また調べて加筆させていただきます!