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 — Liest das Zeichen, auf welches der Dateizeiger zeigt
Beschreibung
Liest ein Zeichen von dem übergebenen Dateizeiger.
Parameter-Liste
- handle
-
Der Zeiger auf eine Datei muss gültig sein und auf eine Datei verweisen, die vorher erfolgreich mit fopen() oder fsockopen() geöffnet (und nicht bereits von fclose() geschlossen) wurde.
Rückgabewerte
Gibt einen String zurück, welcher ein einzelnes Zeichen von der aktuellen Position des Dateizeigers handle enthält. Gibt FALSE zurück, wenn der Dateizeiger am Ende der Datei steht (EOF).
Diese Funktion kann sowohl das boolsche FALSE zurückliefern, als auch einen nicht-boolschen Wert, wie zum Beispiel 0 oder "", der von einem einfachen if-Statement als FALSE ausgewertet wird. Weitere Informationen entnehmen Sie bitte dem Abschnitt über die boolschen Typen. Benutzen Sie deshalb den === Operator, um den Rückgabewert dieser Funktion zu überprüfen.
Beispiele
Beispiel #1 Ein fgetc() Beispiel
<?php
$fp = fopen('somefile.txt', 'r');
if (!$fp) {
echo 'Konnte Datei somefile.txt nicht öffnen';
}
while (false !== ($char = fgetc($fp))) {
echo "$char\n";
}
?>
Anmerkungen
Hinweis: Diese Funktion ist binary safe.
Siehe auch
- fread() - Liest Binärdaten aus einer Datei
- fopen() - Öffnet eine Datei oder URL
- popen() - Öffnet einen Prozesszeiger
- fsockopen() - Stellt eine Internet- oder Unix-Domain-Socket-Verbindung her
- fgets() - Liest eine Zeile von der Position des Dateizeigers
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"` ) );
