可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want to write a PHP script that I can use from the command line. I want it to prompt and accept input for a few items, and then spit out some results. I want to do this in PHP, because all my classes and libraries are in PHP, and I just want to make a simple command line interface to a few things.
The prompting and accepting repeated command line inputs is the part that's tripping me up. How do I do this?
回答1:
From PHP: Read from Keyboard – Get User Input from Keyboard Console by Typing:
You need a special file: php://stdin
which stands for the standard input.
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:
The I/O Streams page from the PHP manual describes how you can use STDIN to read a line from the command line:
<?php
$line = trim(fgets(STDIN)); // reads one line from STDIN
fscanf(STDIN, "%d\n", $number); // reads number from STDIN
?>
回答3:
I'm not sure how complex your input might be, but readline is an excellent way to handle it for interactive CLI programs.
You get the same creature comforts out of it that you would expect from your shell, such as command history.
Using it is as simple as:
$command = readline("Enter Command: ");
/* Then add the input to the command history */
readline_add_history($command);
If available, it really does make it simple.
Here a typical do-case-while for console implementation:
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');
where user can use arrows (up and down) to access the history.
回答4:
I found an example on PHP.net, Utiliser PHP en ligne de commande:
$handle = fopen("php://stdin", "r");
$line = fgets($handle);
if (trim($line) != 'yes') {
...
回答5:
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";
回答6:
My five cents:
Using STDOUT
and 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);
回答7:
The algorithm is simple:
until done:
display prompt
line := read a command line of input
handle line
It's very trivial to use an array that maps commands to callback functions that handle them. The entire challenge is roughly a while
loop, and two function calls. PHP also has a readline interface for more advanced shell applications.
回答8:
One line of code (line 2):
<?php
$name = trim(shell_exec("read -p 'Enter your name: ' name\necho \$name"));
echo "Hello $name, this is PHP speaking\n";
exit;
Checkout this answer's source in blog post How can I capture user input from the cmd line using PHP?.
回答9:
Basically you read from standard input. See Input/output streams.