20.4. Reading from the Keyboard20.4.2. SolutionUse fopen( ) with the special filename php://stdin: 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"; If the Readline extension is installed, use readline( ): $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. DiscussionOnce 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++; } This example displays a prompt with an incrementing count before each line. Since each line is added to the readline history with readline_add_history( ), pressing the up and down arrows at a prompt scrolls through the previously entered lines. 20.4.4. See AlsoDocumentation on fopen( ) at http://www.php.net/fopen, fgets( ) at http://www.php.net/fgets, fread( ) at http://www.php.net/fread, and the Readline extension at http://www.php.net/readline; the Readline library at http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html. Copyright © 2003 O'Reilly & Associates. All rights reserved. |
|