XLV. GNU Readline

简介

The readline() functions implement an interface to the GNU Readline library. These are functions that provide editable command lines. An example being the way Bash allows you to use the arrow keys to insert characters or scroll through command history. Because of the interactive nature of this library, it will be of little use for writing Web applications, but may be useful when writing scripts used from a command line.

注: 本扩展模块在 Windows 平台下不可用。

需求

To use the readline functions, you need to install libreadline. You can find libreadline on the home page of the GNU Readline project, at http://cnswww.cns.cwru.edu/~chet/readline/rltop.html. It's maintained by Chet Ramey, who's also the author of Bash.

You can also use these functions with the libedit library, a non-GPL replacement for the readline library. The libedit library is BSD licensed and available for download from http://sourceforge.net/projects/libedit/.

安装

To use these functions you must compile the CGI or CLI version of PHP with readline support. You need to configure PHP --with-readline[=DIR]. In order you want to use the libedit readline replacement, configure PHP --with-libedit[=DIR].

运行时配置

本扩展模块在 php.ini 中未定义任何配置选项。

资源类型

本扩展模块未定义任何资源类型。

预定义常量

本扩展模块未定义任何常量。

目录
readline_add_history -- Adds a line to the history
readline_callback_handler_install -- Initializes the readline callback interface and terminal, prints the prompt and returns immediately
readline_callback_handler_remove -- Removes a previously installed callback handler and restores terminal settings
readline_callback_read_char -- Reads a character and informs the readline callback interface when a line is received
readline_clear_history -- Clears the history
readline_completion_function -- Registers a completion function
readline_info -- Gets/sets various internal readline variables
readline_list_history -- Lists the history
readline_on_new_line --  Inform readline that the cursor has moved to a new line
readline_read_history -- Reads the history
readline_redisplay --  Ask readline to redraw the display
readline_write_history -- Writes the history
readline -- Reads a line

add a note add a note User Contributed Notes
flobee
29-Apr-2006 01:29
re to: ds at NOSPAM dot undesigned dot org dot za

cool program! note when trying to exec() something:
in the while loop you need to reset exec() returns or you will get all results of all executions (on my my windows and or cygwin :-(
like:
<?php
// your class prompt()

echo "Enter something or 'exit' to quit\n";
do {
  
$cmdline = new prompt();
  
$buffer = $cmdline->get('shell command: ');
// init/ reset first!
  
$data = null;
  
$return = null;
// now start:
  
echo "You said: $buffer\n";
   if (!empty(
$buffer)) {
      
$x = exec($buffer, $data, $return);
      
print_r($data);
   }
} while (
$buffer !== "exit");
echo
"Goodbye\n";
jeffrey at thompsonic dot com
22-Feb-2005 10:18
Here's an easy way without readline() if you don't have it compiled in already:

   $fp = fopen("php://stdin","r");
   $line = rtrim(fgets($fp, 1024);
jcl atNOSPAM jcl dot name
24-Nov-2004 01:40
Even better than 'plz at dont dot spam' in only one line :) :

@c:\\php\\cli\\php.exe script.php %*

Cheers,
Jean-Charles
plz at dont dot spam
08-Aug-2004 04:50
To get all arguments passed to a batch file in one variable
rather than using %1 %2 %3 etc;

:LOOP
if "%1" == "" goto DONE
set args=%args% %1
shift
goto LOOP
:DONE
@c:\\php\\cli\\php.exe script.php %args%
set args=
ds at NOSPAM dot undesigned dot org dot za
05-Dec-2003 12:04
You can open /dev/tty on unix systems or \con in windows, with ob_implicit_flush(true) to write output unbuffered.  Works like a charm :-)

-------------------------------

#!/usr/local/bin/php -q
<?php

set_time_limit
(0);
@
ob_end_flush();
ob_implicit_flush(true);

class
prompt {
  var
$tty;

  function
prompt() {
   if (
substr(PHP_OS, 0, 3) == "WIN") {
    
$this->tty = fOpen("\con", "rb");
   } else {
     if (!(
$this->tty = fOpen("/dev/tty", "r"))) {
      
$this->tty = fOpen("php://stdin", "r");
     }
   }
  }

  function
get($string, $length = 1024) {
   echo
$string;
  
$result = trim(fGets($this->tty, $length));
   echo
"\n";
   return
$result;
  }
}

echo
"Enter something or 'exit' to quit\n";
do {
 
$cmdline = new prompt();
 
$buffer = $cmdline->get("Something: ");
  echo
"You said: $buffer\n";
} while (
$buffer !== "exit");
echo
"Goodbye\n";

?>
jewfish at jewfish dot net
11-Jun-2002 07:05
There is a simpler way to do a multiline read than above:

function multiline() {
   while(($in = readline("")) != ".")
       $story .= ($PHP_OS == "WINNT") ? "\r\n".$in :
                                         "\n".$in;

   return $story;
}
joshua at neocodesoftware.com
21-Apr-2002 06:17
Here's an example simple readline-like way to input from command line on windows - the single line is from http://www.phpbuilder.com/columns/darrell20000319.php3, the multiline is something I added...

<?
function read () {
  
# 4092 max on win32 fopen

  
$fp=fopen("php://stdin", "r");
  
$in=fgets($fp,4094);
  
fclose($fp);

  
# strip newline
  
(PHP_OS == "WINNT") ? ($read = str_replace("\r\n", "", $in)) : ($read = str_replace("\n", "", $in));

   return
$read;
}

function
multilineread () {
   do {
      
$in = read();

      
# test exit
      
if ($in == ".") return $read;

      
# concat input
      
(PHP_OS == "WINNT") ? ($read = $read . ($read ? "\r\n" : "") . $in) : ($read = $read . "\n" . $in);

   } while (
$inp != ".");

   return
$read;
}

print(
"End input with . on line by itself.\n");

print(
"What is your first name?\n");
$first_name = multilineread();

print(
"What is your last name?\n");
$last_name = read();

print(
"\nHello, $first_name $last_name! Nice to meet you! \n");
?>
14-Apr-2002 10:17
[Ed. note: you can use fopen("php://stdin", "w") to achieve the same thing, works on both Windows and Unix)]

I wanted to get console input in a PHP script running on windows, so I made a little hack, which is so simple, it is clearly public domain.  What I did was write a C++ program to get a line, then output it.  Then all that is needed is to exec() that program and capture the output - readline() for windows.  The C++ source is as follows:

#include <iostream.h>
#include <string>
void main()
{
   string input;
   cin >> input;
   cout << input;
}

It works wonderfully for my purposes, since I love the PHP language and want to have console input.

Justin Henck