在线手册:中文 英文

Readline 函数

Table of Contents

在线手册:中文 英文
PHP手册 - N: Readline 函数


david at acz dot org (28-Feb-2007 05:07)

Readline only reads the window size on startup or on SIGWINCH.  This means if the window is resized when not in a readline() call, the next call will have odd behavior due to confusion about the window size.

The work-around is to force Readline to re-read the window size by sending it SIGWINCH.  This is accomplished using the async interface, which installs the signal handler but returns control to PHP.

The following function is a drop-in replacement for readline(), but re-reads the window size every time:

    function xreadline($prompt)
        global $xreadline, $xreadline_line;
        $code = '$GLOBALS["xreadline"] = false;' .
                '$GLOBALS["xreadline_line"] = $line;' .
        $cb = create_function('$line', $code);
        readline_callback_handler_install($prompt, $cb);
        $signal = defined("SIGWINCH") ? SIGWINCH : 28;
        posix_kill(posix_getpid(), $signal);
        $xreadline = true;
        while ($xreadline)
        return is_null($xreadline_line) ? false : $xreadline_line;

flobee (28-Apr-2006 06: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 :-(
// 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);
} while (
$buffer !== "exit");

jeffrey at thompsonic dot com (22-Feb-2005 02: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 (23-Nov-2004 05:40)

Even better than 'plz at dont dot spam' in only one line :) :

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


plz at dont dot spam (08-Aug-2004 09:50)

To get all arguments passed to a batch file in one variable
rather than using %1 %2 %3 etc;

if "%1" == "" goto DONE
set args=%args% %1
goto LOOP
@c:\\php\\cli\\php.exe script.php %args%
set args=

ds at NOSPAM dot undesigned dot org dot za (05-Dec-2003 04: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


prompt {

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");

get($string, $length = 1024) {
$result = trim(fGets($this->tty, $length));

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


jewfish at jewfish dot net (11-Jun-2002 12: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 :

    return $story;

joshua at (21-Apr-2002 11:17)

Here's an example simple readline-like way to input from command line on windows - the single line is from, the multiline is something I added...

function read () {
    # 4092 max on win32 fopen

    $fp=fopen("php://stdin", "r");

    # 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 03: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