20.4.1 Problem
20.4.2 Solution
print "Type your message. Type '.' on a line by itself when you're done.\n";
$fh = fopen('php://stdin','r') or die($php_errormsg);
$last_line = false; $message = '';
while (! $last_line) {
$next_line = fgets($fp,1024);
if (".\n" == $next_line) {
$last_line = true;
} else {
$message .= $next_line;
}
}
print "\nYour message is:\n$message\n";
$last_line = false; $message = '';
while (! $last_line) {
$next_line = readline();
if ('.' == $next_line) {
$last_line = true;
} else {
$message .= $next_line."\n";
}
}
print "\nYour message is:\n$message\n";
20.4.3 Discussion
Once you get a file handle pointing to stdin with fopen( ), you can use all the
standard file-reading functions to process input (fread( ), fgets(
), etc.) The solution uses fgets( ), which returns input a line at
a time. If you use fread( ), the input still needs to be
newline-terminated to make fread( ) return. For example, if you run:
$fh = fopen('php://stdin','r') or die($php_errormsg);
$msg = fread($fh,4);
print "[$msg]";
And type in tomato and then a newline, the output is
[toma]. The fread( ) grabs only four characters from stdin, as directed, but still needs the newline as a
signal to return from waiting for keyboard input.
The Readline extension provides an interface to the GNU Readline library. The readline( ) function
returns a line at a time, without the ending newline. Readline allows Emacs and
vi-style line editing by users. You can also use it to keep a history of previously entered
commands:
$command_count = 1;
while (true) {
$line = readline("[$command_count]--> ");
readline_add_history($line);
if (is_readable($line)) {
print "$line is a readable file.\n";
}
$command_count++;
}