HOME


PHPのちょっとしたTIPS

Last Modified : 2003/03/18 (Tue)
No.6 コマンドラインで使う - $argc $argv php://stdin

PHPのCGIバイナリをコマンドラインで使用します。
以下、シェルで実行する場合"%"で書き始めます。

コマンドラインオプションの表示

まずはPHPのコマンドラインオプションを確認します。
"-h"を付けて実行します。

% php -h
Usage: php [-q] [-h] [-s [-v] [-i] [-f <file>] |  {<file> [args...]}
  -q             Quiet-mode.  Suppress HTTP Header output.
  -s             Display colour syntax highlighted source.
  -f <file>      Parse <file>.  Implies `-q'
  -v             Version number
  -C             Do not chdir to the script's directory
  -c <path>      Look for php.ini file in this directory
  -a             Run interactively
  -d foo[=bar]   Define INI entry foo with value 'bar'
  -e             Generate extended information for debugger/profiler
  -z <file>      Load Zend extension <file>.
  -l             Syntax check only (lint)
  -m             Show compiled in modules
  -i             PHP information
  -h             This help
コマンドラインで実行するときはHTTPヘッダは不要な場合が多いので"-q"又は"-f"を
付けて実行することが多いと思います。ここでは"-q"を付けることにします。

実行の仕方

スクリプトをコマンドラインで実行するには、
% php -q ファイル名
とします。でもこれは毎回面倒なのでシェルスクリプトみたいにスクリプトの1行目に、
#!/usr/local/bin/php -q
を追加し、
% chmod 700 ファイル名
などとして実行属性を付ければ
% ./ファイル名
パスが通っていれば単に、
% ファイル名
として実行が可能になります。以下この方法でいきます。

引数の受け渡し

PHPをコマンドラインで実行すると、コマンドラインで与えた引数の情報が
$argc、$argvという変数に格納されます。

$argc : 引数の数
$argv : 引数が格納された配列

普通、最低でも引数としてファイル名が指定されているので、

$argc : 1
$argv[0] : ファイル名(パス)

となるはずです。

例えば、
(test.php)
#!/usr/local/bin/php -q
<?php
for ($i = 0; $i < $argc; $i++) {
    echo $i, " : ", $argv[$i], "\n";
}
?>
と書いたファイル(test.php)をコマンドラインで実行します。
% ./test.php a b c d e f g
の結果は、
-------------------
0 : ./test.php
1 : a
2 : b
3 : c
4 : d
5 : e
6 : f
7 : g
-------------------
となります。
引数のデリミタ(区切り文字)はスペースですが、引数にスペースを含める時は" "で括るといいです。
% ./test.php "a b c d e f g"
の結果は、
-------------------
0 : ./test.php
1 : a b c d e f g
-------------------
となります。又は
% ./test.php a\ b\ c\ d\ e\ f\ g
のように\でエスケープしても大丈夫です。(結果は同じ)

ユーザからの入力を取得する

fopen()の第一引数に"php://stdin"を使用して標準入力をオープンし、fgets()で入力を取得することができます。
以下は、ユーザに名前を入力させて、一致すれば"Hello!! 名前"と出力して終了するサンプルです。
#!/usr/local/bin/php -q
<?php

//タイムリミットを無効にする
set_time_limit(0);

//名前
$name = "TOMO";

//標準入力をオープン
$stdin = fopen("php://stdin", "r");

if (!$stdin) {
    die("Error\n");
}

for (;;) {

    echo "Input your name: ";

    //1行取得(同時に改行削除)
    $line = trim(fgets($stdin, 64));

    //名前が合致すれば終了
    if ($line == $name) {
        echo "Hello!! $name\n";
        break;
    } else {
        echo "Wrong!!\n";
    }
}

//標準入力をクローズ
fclose($stdin);

?>

"php://stdin"を使用することでユーザからの入力を取得して、対話的なコマンドラインツールを作ることができます。