Я хочу написать php-скрипт, который я могу использовать из командной строки. Я хочу, чтобы он запрашивал и принимал ввод для нескольких элементов, а затем выдавал некоторые результаты. Я хочу сделать это в php, потому что все мои классы и библиотеки находятся в php, и я просто хочу сделать простой интерфейс командной строки для нескольких вещей.
Запрос и прием повторных входов командной строки – это часть, которая меня отключает. Как мне это сделать?
От 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; } }
Страница « Потоки ввода-вывода» из руководства по PHP описывает, как вы можете использовать STDIN для чтения строки из командной строки:
<?php $line = trim(fgets(STDIN)); // reads one line from STDIN fscanf(STDIN, "%d\n", $number); // reads number from STDIN ?>
Я не уверен, насколько сложным может быть ваш ввод, но readline – отличный способ справиться с этим для интерактивных программ CLI.
Вы получаете те же самые удобства существ, которые вы ожидаете от своей оболочки, такие как история команд.
Использование его так же просто, как:
$command = readline("Enter Command: "); /* Then add the input to the command history */ readline_add_history($command);
Если доступно , это действительно упрощает процесс.
Найден пример на PHP.net: http://www.php.net/manual/fr/features.commandline.php#94924
$handle = fopen ("php://stdin","r"); $line = fgets($handle); if(trim($line) != 'yes') { ...
Алгоритм прост:
until done: display prompt line := read a command line of input handle line
Очень просто использовать Array (), который отображает команды на функции обратного вызова, которые обрабатывают их. Вся задача – это цикл while и два вызова функций. PHP также имеет интерфейс readline для более сложных приложений оболочки.
Одна строка кода (строка 2):
<?php $name = trim(shell_exec("read -p 'Enter your name: ' name\necho \$name")); echo "Hello $name this is PHP speaking\n"; exit;
Проверьте источник этого ответа на http://oneqonea.blogspot.com/2012/04/how-can-i-capture-user-input-from-cmd.html
Просто:
#!/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";
Мои пять центов: использование 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);
В основном вы читаете со стандартного ввода. См. http://www.php.net/manual/en/features.commandline.io-streams.php .