是否有可能防止;“意外重复”;在PHP CLI上接受空输入时?

是否有可能防止;“意外重复”;在PHP CLI上接受空输入时?,php,windows,Php,Windows,我试图让用户按Enter键,然后执行一个操作。我希望要求用户释放密钥,直到执行下一个操作。目前,用户只需按住Enter键即可打印所有这些行,因为它只需逐个执行这些行。我希望脚本停止,直到他们再次按Enter键 例如: fgets(STDIN); echo 'text 1' . PHP_EOL; fgets(STDIN); echo 'text 2' . PHP_EOL; fgets(STDIN); echo 'text 3' . PHP_EOL; fgets(STDIN); echo 'text

我试图让用户按Enter键,然后执行一个操作。我希望要求用户释放密钥,直到执行下一个操作。目前,用户只需按住Enter键即可打印所有这些行,因为它只需逐个执行这些行。我希望脚本停止,直到他们再次按Enter键

例如:

fgets(STDIN);
echo 'text 1' . PHP_EOL;
fgets(STDIN);
echo 'text 2' . PHP_EOL;
fgets(STDIN);
echo 'text 3' . PHP_EOL;
fgets(STDIN);
echo 'text 4' . PHP_EOL;
fgets(STDIN);
echo 'text 5' . PHP_EOL;
操作:用户按Enter键

结果:如果按住Enter键,所有内容都将打印出来

想要的结果:“文本1”仅限,直到再次按下Enter键,此时应显示“文本2”,依此类推

要求用户键入内容是不可接受的;它必须是一个简单的回车键(空输入)

可能吗?我不能告诉你有多少次我因为这个错误在一个循环中意外地执行了两个操作


我认为这是不可能的,那么?

您可以检查两次
fgets
调用之间的间隔

$t1 = 0;
function getkey()
{
    global $t1;
    do
    {
        fgets(STDIN);
        $t2 = microtime(true);
        $diff = $t2 - $t1;
        $t1 = $t2;
    }
    while($diff < 0.6);
}

getkey();
echo ...;
getkey();
echo ...;
$t1=0;
函数getkey()
{
全球1美元;
做
{
fgets(STDIN);
$t2=微时间(真);
$diff=$t2-$t1;
$t1=$t2;
}
而($diff<0.6);
}
getkey();
回声。。。;
getkey();
回声。。。;

这不会阻止生成新行,但不会执行下一行。

这是键盘子系统的一项功能。如果您按住一个键,在一个小延迟后,它将重复。Php只处理键盘缓冲区中的结果键,即重复代码已经运行之后的结果键。您应该能够在系统设置中关闭按键重复。php不处理键盘按键,只处理字符。它从终端获取数据,然后从操作系统获取数据。当然,但你可能会认为有某种方法可以确保它是一个“新按键”?STDIN基本上是与键盘缓冲区的直接连接。如果你把香肠放在某把钥匙上,那把钥匙会填满缓冲区。问题不在于它重复的时间,而在于它是否会重复。但这似乎无法避免?正如Ferrybig上面所说,您可以通过操作系统配置禁用键盘重复。我认为问题在于您不小心按住了enter键一段时间。