PHP Conference Japan 2024

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=[];
}

它并不优雅,并且每秒调用一次 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++ 程序来获取一行,然后输出它。然后,只需要 exec() 该程序并捕获输出 - 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 年前
如果你没有预先编译它,这里有一个无需 readline() 的简单方法

$fp = fopen("php://stdin","r");
$line = rtrim(fgets($fp, 1024);
-1
ds at NOSPAM dot undesigned dot org dot za
21 年前
你可以在 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
20年前
甚至比 'plz at dont dot spam' 在一行中更好 :)

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

此致,
Jean-Charles
-1
joshua at neocodesoftware.com
22 年前
这是一个在Windows命令行中进行类似readline输入的简单示例 - 单行代码来自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