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);
}
?>
(PHP 4, PHP 5, PHP 7)
fgetc — Gets character from file pointer
$stream
) : string|falseGets a character from the given file pointer.
stream
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()).
Returns a string containing a single character read from the file pointed
to by stream
. 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
. Vă rugăm să
citiți secțiunea despre tipul Boolean
pentru informații suplimentare. Utilizați
operatorul === pentru a
verifica valoarea întoarsă de această funcție.
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";
}
?>
Notă: Această funcție acceptă și date binare.
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);
}
?>
You can't just simple print separated characters of a text which is encoded in multibyte character set like this;
Because fgetc() will break each multibyte character on its every byte. Consider this example:
<?php
$path = 'foo/cyrillic.txt';
$handle = fopen($path, 'rb');
while (FALSE !== ($ch = fgetc($handle))) {
$curs = ftell($hanlde);
print "[$curs:] $ch\n";
}
/* The result will be something like this:
<
[1]: <
[2]: h
[3]: 2
[4]: >
[5]: �
[6]: �
[7]: �
[8]: �
[9]: �
[10]: �
[11]:
[12]: �
[13]: �
[14]: �
[15]: �
[16]: �
*/ ?>
I don't think this is the best, but it can be a workaround:
<?php
$path = 'path/to/your/file.ext';
if (!$handle = fopen($path, 'rb')) {
echo "Can't open ($path) file';
exit;
}
$mbch = ''; // keeps the first byte of 2-byte cyrillic letters
while (FALSE !== ($ch = fgetc($handle))) {
//check for the sign of 2-byte cyrillic letters
if (empty($mbch) && (FALSE !== array_search(ord($ch), Array(208,209,129)))) {
$mbch = $ch; // keep the first byte
continue;
}
$curs = ftell($handle);
print "[$curs]: " . $mbch . $ch . PHP_EOL;
// or print "[$curs]: $mbch$ch\n";
if (!empty($mbch)) $mbch = ''; // erase the byte after using
}
?>
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"` ) );
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();
?>