Как мне написать интерактивный скрипт PHP из командной строки? - PullRequest
19 голосов
/ 28 мая 2010

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

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

Ответы [ 9 ]

19 голосов
/ 28 мая 2010

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

<?php
 $line = trim(fgets(STDIN)); // reads one line from STDIN
 fscanf(STDIN, "%d\n", $number); // reads number from STDIN
?>
15 голосов
/ 28 мая 2010

С 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;
    }
}
10 голосов
/ 28 мая 2010

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

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

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

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

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


Вот типичный do-case-while для реализации консоли:

do {
  $cmd = trim(strtolower( readline("\n> Command: ") ));
  readline_add_history($cmd);
  switch ($cmd) {
    case 'hello': print "\n -- HELLO!\n"; break;
    case 'bye': break;
    default: print "\n -- You say '$cmd'... say 'bye' or 'hello'.\n";
  }
} while ($cmd!='bye');

, где пользователь может использовать стрелки (вверх и вниз) для доступа к истории.

3 голосов
/ 28 мая 2010

Я нашел пример на PHP.net, Utiliser PHP en ligne de commande :

$handle = fopen("php://stdin", "r");
$line = fgets($handle);
if (trim($line) != 'yes') {
...
1 голос
/ 19 февраля 2015

Мои пять центов: Использование 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);
1 голос
/ 06 июля 2013

Simple:

#!/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's not an option you idiot. Let's try this again.", "\n";
        continue;
    }
}

echo "\n","You're very brave. Let's continue with what we wanted to do.", "\n\n";
1 голос
/ 01 мая 2012

Одна строка кода (строка 2):

<?php
    $name = trim(shell_exec("read -p 'Enter your name: ' name\necho \$name"));
    echo "Hello $name, this is PHP speaking\n";
    exit;

Извлечение источника этого ответа в блоге Как я могу получить пользовательский ввод из строки cmd с помощью PHP? .

1 голос
/ 28 мая 2010

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

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

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

0 голосов
/ 28 мая 2010

В основном вы читаете со стандартного ввода.См. Потоки ввода / вывода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...