PHP Conference Japan 2024

readline

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

readline读取一行

描述

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

从用户读取一行。您必须使用 readline_add_history() 将此行添加到历史记录。

参数

prompt

您可以指定一个字符串来提示用户。

返回值

返回用户输入的一个字符串。返回的行已删除结尾的换行符。如果没有更多数据可读,则返回 false

示例

示例 #1 readline() 示例

<?php
// 从用户获取 3 条命令
for ($i=0; $i < 3; $i++) {
$line = readline("Command: ");
readline_add_history($line);
}

// 转储历史记录
print_r(readline_list_history());

// 转储变量
print_r(readline_info());
?>

添加注释

用户贡献的注释 5 条注释

Antony Penn
4 年前
Christian 的代码运行良好,但如果您希望能够隐藏用户输入而不将其回显到屏幕上,则需要向 read 命令添加 -s。下面的代码是一个扩展函数,允许可选提示和可选隐藏输入

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;
}
turdsurfer
7 年前
如果您的 CLI 脚本接受来自 STDIN 的输入,并且您也希望它提示输入密码(例如 mysql 客户端那样),那么 readline() 将不适合您。
您需要做的是从终端设备读取,如下所示。

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; # 可能不在终端运行。
}
$line = rtrim(fgets($h),"\r\n");
fclose($h);
return $line;
}
$pass = readline_terminal('Password: ');
cox at idecnet dot com
22 年前
在 CGI 模式下,请确保在脚本顶部调用

ob_implicit_flush(true);

如果您希望能够在提示之前和之后输出数据。

-- Tomas V.V.Cox
匿名
7 年前
一些观察……

我使用 Cygwin PHP v7,readline 可用。但是,readline_list_history() 函数未定义。

带有转义序列的提示将被清理,因此请使用类似以下内容

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

我没有完全记录它,但我看到有时以标点符号开头的字符串不会通过 readline_add_history() 进入历史记录。它们有时还会清除提示字符串。
rojaro at gmail dot com
16 年前
请注意,当用户按下 CTRL+D 时,readline() 将返回布尔值“false”。
To Top