PHP 8.4.2 Released!

readline

(PHP 4, PHP 5, PHP 7, PHP 8)

readlineLiest eine Zeile

Beschreibung

readline(?string $prompt = null): string|false

Liest eine einzelne Zeile vom Benutzer ein. Sie müssen diese Zeile selbst mittels readline_add_history() zur History hinzufügen.

Parameter-Liste

prompt

Sie können eine Zeichenkette angeben, mit dem Sie den Benutzer zur Eingabe auffordern.

Rückgabewerte

Gibt eine einzelne Zeile des Benutzers zurück. Der Zeile, die zurückgegeben wird, fehlt das abschließende Zeichen für einen Zeilenvorschub. Können keine weiteren Daten gelesen werden, wird false zurückgegeben.

Beispiele

Beispiel #1 readline()-Beispiel

<?php
// Drei Kommandos vom Benutzer abfragen
for ($i=0; $i < 3; $i++) {
$line = readline("Command: ");
readline_add_history($line);
}

// History ausgeben
print_r(readline_list_history());

// Variablen ausgeben
print_r(readline_info());
?>

add a note

User Contributed Notes 5 notes

up
16
Antony Penn
4 years ago
Christian's code works well, but if you want to be able to hide the user input and not echo it to screen, you need to add -s to the read command. The code below is an expanded function that allows an optional prompt and optional hiding of the input:

function read_password($prompt=null, $hide=false)
{
if($prompt) print $prompt;
$s = ($hide) ? '-s' : '';
$f=popen("read $s; echo \$REPLY","r");
$input=fgets($f,100);
pclose($f);
if($hide) print "\n";
return $input;
}
up
7
turdsurfer
7 years ago
If your CLI script accepts input from STDIN and you also want it to prompt for a password (e.g. as mysql client does), then readline() won't work for you.
What you need to do is read from the terminal device as shown below.

function readline_terminal($prompt = '') {
$prompt && print $prompt;
$terminal_device = '/dev/tty';
$h = fopen($terminal_device, 'r');
if ($h === false) {
#throw new RuntimeException("Failed to open terminal device $terminal_device");
return false; # probably not running in a terminal.
}
$line = rtrim(fgets($h),"\r\n");
fclose($h);
return $line;
}
$pass = readline_terminal('Password: ');
up
2
cox at idecnet dot com
22 years ago
In CGI mode be sure to call:

ob_implicit_flush(true);

at the top of your script if you want to be able to output data before and after the prompt.

-- Tomas V.V.Cox
up
0
Anonymous
7 years ago
a few observations....

I use Cygwin PHP v7 and readline is available. The readline_list_history() function though is not defined.

A prompt with escape sequences are sanitized, so use something like:

<?php
echo("\e[0m\e[34mPromt>\e[0m");
$inp = readline(' ');
?>

I have not fully documented it, but I see that sometimes strings beginning with punctuation characters do not make it into the history with readline_add_history(). They also sometimes clear the prompt string.
up
-1
rojaro at gmail dot com
16 years ago
Note that readline() will return boolean "false" when the user presses CTRL+D.
To Top