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 — Obtiene un carácter de un puntero a un archivo
Descripción
Obtiene un carácter desde un puntero a un archivo dado.
Parámetros
- handle
-
El fichero al que se apunta debe ser válido, y debe apuntar a un fichero abierto por fopen() o fsockopen() (y que todavía no esté cerrado por fclose()).
Valores devueltos
Devuelve una cadena que contiene un sólo carácter leído desde el archivo apuntado por handle. Devuelve FALSE sobre EOF.
Esta función quizá devuelve Boolean FALSE, pero quizá también devuelve un valor non-Boolean que se evaluará como FALSE, como 0 o "". Por favor lea la sección en Booleans para más información. Use el operador === para testear el valor devuelto por esta función.
Ejemplos
Example #1 Un ejemplo de fgetc()
<?php
$fp = fopen('archivo.txt', 'r');
if (!$fp) {
echo 'No se pudo abrir archivo.txt';
}
while (false !== ($carácter = fgetc($fp))) {
echo "$carácter\n";
}
?>
Notas
Note: Esta función es segura binariamente.
Ver también
- fread() - Lectura de un fichero en modo binario seguro
- fopen() - Abre un archivo o URL
- popen() - Abre un proceso de un puntero a un archivo
- fsockopen() - Open Internet or Unix domain socket connection
- fgets() - Obtiene un línea del puntero a un archivo
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"` ) );
