Readline 函数

目录

添加笔记

用户贡献的笔记 10 笔记

4
david at acz dot org
17 年前
Readline 只在启动时或在 SIGWINCH 时读取窗口大小。这意味着如果在 readline() 调用之外调整窗口大小,则下次调用将由于对窗口大小的混淆而导致奇怪的行为。

解决方法是强制 Readline 重新读取窗口大小,方法是向其发送 SIGWINCH。这是通过异步接口完成的,该接口安装信号处理程序但将控制权返回给 PHP。

以下函数是 readline() 的直接替换,但每次都会重新读取窗口大小

<?
function xreadline($prompt)
{
global $xreadline, $xreadline_line;
$code = '$GLOBALS["xreadline"] = false;' .
'$GLOBALS["xreadline_line"] = $line;' .
'readline_callback_handler_remove();';
$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)
readline_callback_read_char();
return is_null($xreadline_line) ? false : $xreadline_line;
}
?>
1
flobee
18 年前
转到:ds at NOSPAM dot undesigned dot org dot za

很酷的程序!注意在尝试执行() 某些内容时
在 while 循环中,您需要重置 exec() 的返回值,否则您将获得所有执行的结果(在我的 Windows 和/或 Cygwin 上 :-(
比如
<?php
// 您的类提示()

echo "输入内容或 'exit' 退出\n";
do {
$cmdline = new prompt();
$buffer = $cmdline->get('shell 命令: ');
// 初始化/重置首先!
$data = null;
$return = null;
// 现在开始:
echo "您输入了: $buffer\n";
if (!empty(
$buffer)) {
$x = exec($buffer, $data, $return);
print_r($data);
}
} while (
$buffer !== "exit");
echo
"再见\n";
1
jcastromail at yahoo dot es
2 年前
Windows。
截至目前,Windows 下的 PHP 8.1 64 位版不支持所有函数

支持的
readline_add_history
readline_clear_history
readline_completion_function
readline_info
readline_list_history
readline_read_history
readline_write_history
readline

不支持: (该函数甚至没有定义)

readline_callback_handler_install
readline_callback_handler_remove
readline_callback_read_char
readline_on_new_line
readline_redisplay

如果您想在 Windows 中读取键(不阻塞),可以使用以下代码

$out='';
$ret='';
$keys='1234567890abcdefghijklmnopqrstuvwxyz'."á";
$default="á";
while(true) {
exec("choice /N /C $keys /D $default /T 1",$out,$ret);
if($out[0]!=="á") {
var_dump($out[0]);
}
$out=[];
}

它并不优雅,它每 1 秒调用一次 choice,但它确实完成了工作(至少对于某些键来说)。
0
jewfish at jewfish dot net
22 年前
有一种比上面更简单的方法来进行多行读取

function multiline() {
while(($in = readline("")) != ".")
$story .= ($PHP_OS == "WINNT") ? "\r\n".$in
"\n".$in;

return $story;
}
0
匿名
22 年前
[编者注:您可以使用 fopen("php://stdin", "w") 来实现相同的效果,在 Windows 和 Unix 上都有效]

我想在 Windows 上运行的 PHP 脚本中获取控制台输入,所以我做了一个小技巧,它非常简单,显然是公共领域的。我所做的是编写一个 C++ 程序来获取一行,然后输出它。然后,只需要执行() 该程序并捕获输出 - Windows 的 readline()。C++ 源代码如下

#include <iostream.h>
#include <string>
void main()
{
string input;
cin >> input;
cout << input;
}

它对我的目的非常有效,因为我喜欢 PHP 语言,并且希望拥有控制台输入。

Justin Henck
-1
jeffrey at thompsonic dot com
19 年前
这是一个简单的方法,如果您的 PHP 还没有编译,则无需 readline()

$fp = fopen("php://stdin","r");
$line = rtrim(fgets($fp, 1024);
-1
ds at NOSPAM dot undesigned dot org dot za
20 年前
您可以在 Unix 系统上打开 /dev/tty 或在 Windows 上打开 \con,并使用 ob_implicit_flush(true) 来非缓冲地写入输出。非常有效 :-)

-------------------------------

#!/usr/local/bin/php -q
<?php

set_time_limit
(0);
@
ob_end_flush();
ob_implicit_flush(true);

class
prompt {
var
$tty;

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

function
get($string, $length = 1024) {
echo
$string;
$result = trim(fGets($this->tty, $length));
echo
"\n";
return
$result;
}
}

echo
"输入内容或输入 'exit' 退出\n";
do {
$cmdline = new prompt();
$buffer = $cmdline->get("请输入内容: ");
echo
"你输入了: $buffer\n";
} while (
$buffer !== "exit");
echo
"再见\n";

?>
-1
jcl atNOSPAM jcl dot name
19 年前
比 'plz at dont dot spam' 更好,只有一行代码 :)

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

干杯!
Jean-Charles
-1
joshua at neocodesoftware.com
22 年前
这是一个简单的 readline 风格的示例,用于在 Windows 命令行上输入 - 单行代码来自 http://www.phpbuilder.com/columns/darrell20000319.php3, 多行代码是我添加的...

<?
function read () {
# 在 win32 fopen 上最大为 4092

$fp=fopen("php://stdin", "r");
$in=fgets($fp,4094);
fclose($fp);

# 去除换行符
(PHP_OS == "WINNT") ? ($read = str_replace("\r\n", "", $in)) : ($read = str_replace("\n", "", $in));

return $read;
}

function multilineread () {
do {
$in = read();

# 测试退出
if ($in == ".") return $read;

# 合并输入
(PHP_OS == "WINNT") ? ($read = $read . ($read ? "\r\n" : "") . $in) : ($read = $read . "\n" . $in);

} while ($inp != ".");

return $read;
}

print("以单独的 . 结束输入。\n");

print("你的名字是什么?\n");
$first_name = multilineread();

print("你的姓氏是什么?\n");
$last_name = read();

print("\n你好,$first_name $last_name!很高兴认识你!\n");
?>
-2
plz at dont dot spam
20 年前
将传递给批处理文件的所有参数存储在一个变量中
而不是使用 %1 %2 %3 等;

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