[分享] PHP命令行程序无缓冲从标准输入读取每一个输入字节的方法

标题的描述可能不是非常清楚,先罗嗦重新解释一下。

通常在命令行里运行PHP脚本时,从标准输入读取数据时是有缓冲的,在终端敲回车前所输入的字符是没有真正发送到服务端的。

某种情况下,我们在做交互程序时,希望用户每键入一个字符就能被脚本检测到并触发相应的功能(实现类似SHELL里上下键可以翻页历史指令)。

这些状况在 TELNET 协议里都有相关的描述,是按回车时传送数据还是一键一传,是否回显用户的输入都是双方协商而定的。

在SSH/TELNET到服务端时会有一个初始协定,如果您想改变它可以调用 stty 指令。PHP的示例代码如下:

system("stty -echo -icanon"); // 告诉终端不要回显和一键一传
$stdin = fopen("php://stdin", "rb");
while ($char = fread($stdin, 1))
{
  echo "you input: $char (ascii=" . ord($char) . ")\n";
}

[分享] PHP命令行程序无缓冲从标准输入读取每一个输入字节的方法》上有1条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>