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 — Lê um caracter do ponteiro de arquivo
Descrição
string fgetc
( resource
$handle
)Obtém um caractere de um dado ponteiro de arquivo.
Parâmetros
-
handle -
The file pointer must be valid, and must point to a file successfully opened by fopen() or fsockopen() (and not yet closed by fclose()).
Valor Retornado
Retorna uma string contendo um único caractere lido do ponteiro do arquivo
passado por handle. Retorna FALSE em EOF.
Aviso
Esta função pode
retornar o booleano FALSE, mas também pode retornar um valor não-booleano que pode ser
avaliado como FALSE, como 0 ou
"". Leia a seção em Booleanos para maiores
informações. Utilize o operador ===
para testar o valor retornado por esta
função.
Exemplos
Exemplo #1 Um exemplo da fgetc()
<?php
$fp = fopen('algumarquivo.txt', 'r');
if (!$fp) {
echo 'Não é possivel abrir algumarquivo.txt';
}
while (false !== ($char = fgetc($fp))) {
echo "$char\n";
}
?>
Notas
Nota: Esta função é binary-safe.
Veja Também
- fread() - Leitura binary-safe de arquivo
- fopen() - Abre um arquivo ou URL
- popen() - Abre um processo como ponteiro de arquivo
- fsockopen() - Abre um socket de conexão Internet ou de domínio Unix
- fgets() - Lê uma linha de um ponteiro de arquivo
ktraas at gmail dot com (Kevin Traas) ¶
4 years ago
sfinktah at php dot spamtrak dot org ¶
2 years ago
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();
?>
alex at alexdemers dot me ¶
4 years ago
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);
}
?>
