Как написать текстовую интерактивную PHP скрипт?

Я хочу написать php script, который я могу использовать из командной строки. Я хочу, чтобы он запрашивал и принимал ввод для нескольких элементов, а затем выдавал некоторые результаты. Я хочу сделать это в php, потому что все мои классы и библиотеки находятся в php, и я просто хочу сделать простой интерфейс командной строки для нескольких вещей.

Приглашение и прием повторных вводов командной строки - это часть, которая меня отключает. Как мне это сделать?

Ответы

Ответ 1

Из PHP: Чтение с клавиатуры - ввод данных пользователя из консоли клавиатуры путем ввода текста в формате:

Вам нужен специальный файл: php://stdin, который обозначает стандартный ввод.

print "Type your message. Type '.' on a line by itself when you're done.\n";

$fp = fopen('php://stdin', 'r');
$last_line = false;
$message = '';
while (!$last_line) {
    $next_line = fgets($fp, 1024); // read the special file to get the user input from keyboard
    if (".\n" == $next_line) {
      $last_line = true;
    } else {
      $message .= $next_line;
    }
}

Ответ 2

Страница I/O Streams из руководства по PHP описывает, как вы можете использовать STDIN для чтения строки из командной строки:

<?php
 $line = trim(fgets(STDIN)); // reads one line from STDIN
 fscanf(STDIN, "%d\n", $number); // reads number from STDIN
?>

Ответ 3

Я не уверен, насколько сложным может быть ваш ввод, но readline - отличный способ обработать его для интерактивных программ CLI.

Вы получаете те же удобства существ, которые вы ожидаете от своей оболочки, например, история команд.

Использование его так же просто, как:

$command = readline("Enter Command: ");
/* Then add the input to the command history */
readline_add_history($command);

Если доступно, это действительно упрощает.

Ответ 5

Алгоритм прост:

until done:
    display prompt
    line := read a command line of input
    handle line

Очень сложно использовать Array(), который отображает команды на функции обратного вызова, которые обрабатывают их. Вся задача - примерно цикл while и два вызова функций. PHP также имеет интерфейс readline для более сложных приложений оболочки.

Ответ 7

Простой:

#!/usr/bin/php
<?php
define('CONFIRMED_NO', 1);

while (1) {
    fputs(STDOUT, "\n"."***WARNING***: This action causes permanent data deletion.\nAre you sure you're not going to wine about it later? [y,n]: ");

    $response = strtolower(trim(fgets(STDIN)));
    if( $response == 'y' ) {
        break;
    } elseif( $response == 'n' ) {
        echo "\n",'So I guess you changed your mind eh?', "\n";
        exit (CONFIRMED_NO);
    } else {
        echo "\n", "Dude, that not an option you idiot. Let try this again.", "\n";
        continue;
    }
}

echo "\n","You're very brave. Let continue with what we wanted to do.", "\n\n";

Ответ 8

Мои пять центов: Используя STDOUT и STDIN:

fwrite(STDOUT, "Please enter your Message (enter 'quit' to leave):\n");

do{
    do{
        $message = trim(fgets(STDIN));
    } while($message == '');

    if(strcasecmp($message, 'quit') != 0){
        fwrite(STDOUT, "Your message: ".$message."\n");
    }

}while(strcasecmp($message,'quit') != 0);
// Exit correctly
exit(0);