̃Gg[͂ĂȃubN}[Nɒlj

PHP :: CLI / 対話的なインターフェイスの例



下記のスクリプトを「interactive.php」として保存。

#!/usr/local/bin/php -q
<?php
 
$name   = "hoge";
$passwd = "1234";
 
set_time_limit(0);
$stdin = fopen("php://stdin", "r");
 
// fopen に失敗した場合、これを記述しておかないと下の while で無限ループが発生する。
if ( ! $stdin) {
    exit("[error] STDIN failure.\n");
}
 
while (true) {
    $input_name   = '';
    $input_passwd = '';
 
    echo "Input your name: ";
    $input_name = trim(fgets($stdin, 64));
 
    if ($input_name == '') continue;
 
    echo "Input ${input_name}'s password: ";
    $input_passwd = trim(fgets($stdin, 64));
 
    if ($input_name == $name && $input_passwd == $passwd) {
        echo "Hello! $name\n";
        break;
    } else {
        echo "[error] $input_name does not exist or invalid password.\n";
        echo "Do you try again? [y/n]: ";
 
        if ('y' == trim(fgets($stdin, 64))) {
            continue;
        } else {
            exit;
        }
    }
}
 
fclose($stdin);
 
?>


スクリプトの仕様

  • name「hoge」と password「1234」を正しく入力すると「Hello! hoge」と出力される。
  • name が未入力の時は「Input your name: 」のプロンプトが何度も表示される。
  • name と password が正しくない時は「[error] *** does not exist or invalid password. Do you try again? [y/n]: 」と出力され、y をタイプすると再試行、n をタイプすると終了する。


正しく入力した場合

% php ./interactive.php
% Input your name: hoge
% Input hoge's password: 1234
% Hello! hoge


間違って入力した場合

% php ./interactive.php
% Input your name: fuga
% Input fuga's password: 1234
% [error] fuga does not exist or invalid password.
% Do you try again? [y/n]:  



programming/php/cli/interactive.txt