PHP 8.5.0 Alpha 1 available for testing

readline

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

readlineLee una línea

Descripción

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

Devuelve una línea introducida por el usuario. La línea debe ser añadida al historial manualmente, mediante la función readline_add_history().

Parámetros

prompt

Puede especificarse un chaîne de caractères para utilizarlo como prompt al usuario.

Valores devueltos

Devuelve un chaîne de caractères del usuario. La línea devuelta ha sido limpiada del carácter final de nueva línea. Si no hay más datos para leer, entonces se devuelve false.

Ejemplos

Ejemplo #1 Ejemplo con readline()

<?php
// Lee 3 comandos del usuario
for ($i=0; $i < 3; $i++) {
$line = readline("Comando : ");
readline_add_history($line);
}

// Lista el historial
print_r(readline_list_history());

// Lista las variables
print_r(readline_info());
?>

add a note

User Contributed Notes 5 notes

up
14
Antony Penn
5 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
6
turdsurfer
8 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
23 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
8 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
-2
rojaro at gmail dot com
16 years ago
Note that readline() will return boolean "false" when the user presses CTRL+D.
To Top