To read a single key-press in CLI mode, you can either use ncurses (which will probably require additional modules for PHP) or get nasty with the *nix "/bin/stty" command)
<?php
function stty($options) {
exec($cmd = "/bin/stty $options", $output, $el);
$el AND die("exec($cmd) failed");
return implode(" ", $output);
}
function getchar($echo = false) {
$echo = $echo ? "" : "-echo";
# Get original settings
$stty_settings = preg_replace("#.*; ?#s", "", stty("--all"));
# Set new ones
stty("cbreak $echo");
# Get characters until a PERIOD is typed,
# showing their hexidecimal ordinal values.
printf("> ");
do {
printf("%02x ", ord($c = fgetc(STDIN)));
} while ($c != '.');
# Return settings
stty($stty_settings);
}
getchar();
?>
fgetc
(PHP 4, PHP 5)
fgetc — Gets character from file pointer
Descrierea
$handle
)Gets a character from the given file pointer.
Parametri
-
handle -
Indicatorul fișierului trebuie să fie valid și trebuie să indice la un fișier deschis cu succes cu ajutorul fopen() sau fsockopen() (și să nu fie închis cu fclose()).
Valorile întoarse
Returns a string containing a single character read from the file pointed
to by handle. Returns FALSE on EOF.
Această funcție poate întoarce valoarea Boolean FALSE, dar poate de
asemenea întoarce o valoare non-Boolean care evaluează în FALSE, cum ar fi
0 sau "". Vă rugăm să citiți secțiunea despre
tipul Boolean pentru mai multe
informații. Utilizați
operatorul === pentru a
verifica valoarea întoarsă de această funcție.
Exemple
Example #1 A fgetc() example
<?php
$fp = fopen('somefile.txt', 'r');
if (!$fp) {
echo 'Could not open file somefile.txt';
}
while (false !== ($char = fgetc($fp))) {
echo "$char\n";
}
?>
Note
Notă: Această funcție acceptă și date binare.
Vedeți de asemenea
- fread() - Binary-safe file read
- fopen() - Opens file or URL
- popen() - Opens process file pointer
- fsockopen() - Open Internet or Unix domain socket connection
- fgets() - Gets line from file pointer
The best and simplest way to get input from a user in the CLI with only PHP is to use fgetc() function with the STDIN constant:
<?php
echo 'Are you sure you want to quit? (y/n) ';
$input = fgetc(STDIN);
if ($input == 'y')
{
exit(0);
}
?>
I was using command-line PHP to create an interactive script and wanted the user to enter just one character of input - in response a Yes/No question. Had some trouble finding a way to do so using fgets(), fgetc(), various suggestions using readline(), popen(), etc. Came up with the following that works quite nicely:
$ans = strtolower( trim( `bash -c "read -n 1 -t 10 ANS ; echo \\\$ANS"` ) );
