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());
?>

添加笔记

用户贡献的笔记 17 笔记

17
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;
}
8
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: ');
1
cox at idecnet dot com
22 年前
在 CGI 模式下,请确保在脚本开头调用

ob_implicit_flush(true);

如果您想在提示符之前和之后输出数据。

-- Tomas V.V.Cox
1
Anonymous
13 年前
Windows 上没有 readline 库。

<?php
if (PHP_OS == 'WINNT') {
echo
'$ ';
$line = stream_get_line(STDIN, 1024, PHP_EOL);
} else {
$line = readline('$ ');
}
?>
0
Anonymous
7 年前
一些观察结果......

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

使用转义序列的提示会进行清理,因此请使用类似

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

我还没有完全记录它,但我注意到有时以标点符号开头的字符串不会通过 readline_add_history() 添加到历史记录中。它们有时也会清除提示字符串。
0
rojaro at gmail dot com
15 年前
请注意,当用户按下 CTRL+D 时,readline() 将返回布尔值“false”。
0
soletan at toxa dot de
17 年前
致 haukew at gmail dot com

readline 提供的功能多于读取单行输入...您的示例中缺少行编辑和历史记录。如果您不需要这些,请使用以下简单的代码

function readline( $prompt = '' )
{
echo $prompt;
return rtrim( fgets( STDIN ), "\n" );
}
-1
sean
15 年前
我想要一个函数,如果 readline 等待时间过长,它会超时...这在 Linux 上的 php CLI 上有效

<?php

function readline_timeout($sec, $def)
{
return
trim(shell_exec('bash -c ' .
escapeshellarg('phprlto=' .
escapeshellarg($def) . ';' .
'read -t ' . ((int)$sec) . ' phprlto;' .
'echo "$phprlto"')));
}

?>

只需调用 readline_timeout(5, 'whatever') 即可从 stdin 读取内容,或者在 5 秒内超时并默认为 'whatever'。我尝试过只使用 shell_exec 而不依赖 bash -c,但这对我不起作用,所以我必须采用这种迂回的方式。
-1
mfuhrman at enetarch dot net
2 年前
要停止自动完成,请注册一个返回没有匹配项的自动完成函数。

function dontAutoComplete ($input, $index)
{ return ([]); }

readline_completion_function ("dontAutoComplete");
-2
christian at gaeking dot de
20 年前
如果 readline 未编译到 php 中,则可以使用解决方法,例如,该命令仅在安装程序中需要。它在 Linux 下的工作方式如下

$f=popen("read; echo \$REPLY","r");
$input=fgets($f,100);
pclose($f);
echo "Entered: $input\n";
-2
taneli at crasman dot fi
15 年前
如果您想在使用 readline 时使用预先填充提示,以下代码对我有用

<?php
function readline_callback($ret)
{
global
$prompt_answer, $prompt_finished;
$prompt_answer = $ret;
$prompt_finished = TRUE;
readline_callback_handler_remove();
}

readline_callback_handler_install('Enter some text> ',
'readline_callback');

$prefill = 'foobar';
for (
$i = 0; $i < strlen($prefill); $i++)
{
readline_info('pending_input', substr($prefill, $i, 1));
readline_callback_read_char();
}

$prompt_finished = FALSE;
$prompt_answer = FALSE;
while (!
$prompt_finished)
readline_callback_read_char();
echo
'You wrote: ' . $prompt_answer . "\n";
?>
-2
divinity76+spam at gmail dot com
2 年前
由于某些原因,readline() 不支持 Unicode,readline 会去除 æøåÆØÅ - 如果你需要支持 Unicode 的 readline 函数,可以尝试
<?php
function readline_with_unicode_support(?string $prompt = null)/*: string|false*/
{
if (
$prompt !== null && $prompt !== '') {
echo
$prompt;
}
$line = fgets(STDIN);
// readline() 会移除末尾的换行符,fgets() 不会,
// 为了模拟真正的 readline(),我们也需要移除它
if ($line !== false && strlen($line) >= strlen(PHP_EOL) && substr_compare($line, PHP_EOL, -strlen(PHP_EOL), strlen(PHP_EOL), true) === 0) {
$line = substr($line, 0, -strlen(PHP_EOL));
}
return
$line;
}
-3
thflori
5 年前
如果你想阻止删除之前的文本并且发现空字符串不起作用:解决方法是使用一个空格并向左移动光标

<?php

echo "> ";
readline(" \e[D");

?>
-5
Ixios
6 年前
在 Windows 和 PHP 7.2.0 下工作

$arr = [];

for ($i=0; $i < 3; $i++) {
$arr[$i] = readline("Commande : ");
}

// 输出
print_r($arr);

----------

输出

Commande : 658
Commande : 965
Commande : 478
数组
(
[0] => 658
[1] => 965
[2] => 478
)
-3
mfuhrman at enetarch dot net
2 年前
<?
/*
*
我注意到 readline 在从 CLI 获取用户输入时存在奇怪的行为。

当我多次按下 Tab 键时,它会将一个 scandir 打印到输入流中。

以下是代码
*
*/

$msg = "";
while ($msg != "quit")
{
while (($msg == "") || ($msg == "\r"))
$msg = readline ("> ");
}
?>
-8
roddric dot kasen at gmail dot com
8 年前
<?php

class ConsoleQuestion
{

function
readline()
{
return
rtrim(fgets(STDIN));
}
}

// 例子 1
$line = new ConsoleQuestion();
$prompt = "What Is Your Name: ";
echo
$prompt;
$answer = $line->readline();
echo
"You Entered: " . $answer;

// 例子 2 (注释掉例子 1,然后取消注释例子 2)
/*$prompt = "What Is Your Name: ";
echo $prompt;
$answer = "You Entered: " . rtrim( fgets( STDIN ));
echo $answer;*/

?>
-5
divinity76 at gmail dot com
2 年前
<?php
/**
* readline() with unicode support
* php's builtin readline has dodgy unicode support, it only works
* with the correct environment locale settings, it doesn't seem to work at Cygwin (strips æøåÆØÅ),
* and it has historically had bugs like https://bugs.php.net/bug.php?id=81598
* meanwhile this readline has consistent unicode support across all platforms (including Cygwin)
* and doesn't care about locale settings.
*
* @param string $prompt
* @return string|false
*/
function readline_with_unicode_support(?string $prompt = null)/*: string|false*/
{
if (
$prompt !== null && $prompt !== '') {
echo
$prompt;
}
$line = fgets(STDIN);
// readline() 会移除末尾的换行符,fgets() 不会,
// 为了模拟真正的 readline(),我们也需要移除它
if ($line !== false && strlen($line) >= strlen(PHP_EOL) && substr_compare($line, PHP_EOL, -strlen(PHP_EOL)) === 0) {
$line = substr($line, 0, -strlen(PHP_EOL));
}
return
$line;
}
To Top