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"` ) );
fgetc
(PHP 4, PHP 5)
fgetc — Obtiene un carácter de un puntero a un archivo
Descripción
$handle
)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 puede
devolver el valor booleano FALSE, pero también puede devolver un valor no booleano que se
evalúa como FALSE. Por favor lea la sección sobre Booleanos para más información. Use
el operador === para comprobar el valor devuelto por esta
función.
Ejemplos
Ejemplo #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
Nota: Esta función es segura binariamente.
Ver también
- fread() - Lectura de un fichero en modo binario seguro
- fopen() - Abre un fichero o una URL
- popen() - Abre un proceso de un puntero a un archivo
- fsockopen() - Abre una conexión vía sockets a Internet o a un dominio Unix
- fgets() - Obtiene una línea desde el puntero a un fichero
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();
?>
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);
}
?>
