Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP控制台应用程序中刷新STDIN?_Php_Console_Stdin_Flush_Command Line Interface - Fatal编程技术网

如何在PHP控制台应用程序中刷新STDIN?

如何在PHP控制台应用程序中刷新STDIN?,php,console,stdin,flush,command-line-interface,Php,Console,Stdin,Flush,Command Line Interface,我用PHP构建了一个简单的命令行实用程序,效果非常好。不幸的是,我们现在有一些不太精明的用户在键盘处理数据时不停地敲击键盘 有没有办法刷新STDIN,使其仅在使用fgetc时开始缓冲数据 我试着打开我自己的标准输入管道,甚至通过循环缓冲区中的东西来冲洗缓冲区,这种方式可以工作,但不能处理多个CRs 在PHP中,倒带和fseek似乎对STDIN没有任何作用 这似乎是一个普遍的问题,但并不多见 PHP版本5.3.3 如果不需要的话,我不想使用ncurses 任何fgets或fgetc都会显示我的问题

我用PHP构建了一个简单的命令行实用程序,效果非常好。不幸的是,我们现在有一些不太精明的用户在键盘处理数据时不停地敲击键盘

有没有办法刷新STDIN,使其仅在使用fgetc时开始缓冲数据

我试着打开我自己的标准输入管道,甚至通过循环缓冲区中的东西来冲洗缓冲区,这种方式可以工作,但不能处理多个CRs

在PHP中,倒带和fseek似乎对STDIN没有任何作用

这似乎是一个普遍的问题,但并不多见

PHP版本5.3.3

如果不需要的话,我不想使用ncurses

任何fgets或fgetc都会显示我的问题。例如,如果您有一个提示,指示正在处理的内容,然后开始输入,那么输入将在STDIN中缓冲,因此当您稍后实际提示用户输入的内容时,将添加到缓冲区中。因此,如果他们在处理过程中键入abc,然后您提示输入一些内容,那么他们的输入是abc加上在您到达fgets或fgetc时在提示下键入的内容。因此,如果有人一直按ENTER键,而您正在使用fgets或fgetc wiating进行\n,则会导致代码过早继续

例如:

echo "Processing";
sleep(10); // HIT ENTER A FEW TIMES HERE
echo "Input Something: ";
// REALLY NEED TO FLUSH STDIN HERE SOMEHOW
fgets(STDIN);

您是否尝试过在每次提示后关闭STDIN流?我想这就是作曲家的创作方式。所以基本上你会输。。。。直到下一个提示。对我来说很有用,但我使用的是PHP5.5,看来PHPReadline是处理这个问题的一个好方法,我会使用它


谢谢大家

迟到总比不迟到好,但你应该能够使用stream\u select

<?php

    while(stream_select($in = [STDIN], $out = [], $oob = [],0)){
        fgetc(STDIN);
    }

?>
基本上,这将查看给定流上是否有可用的数据,如果有,则从该流中读取数据,而不进行任何处理


在此之后,您可以从stdin读取您想要的输入

我不明白问题所在。你能展示一个简单的代码示例以及它应该做什么吗?PHP根本没有线程,我很好奇谁认为用PHP编写一个CLI util而不是Python或Java是个好主意。。有了线程技术,你可能不会有这个问题,但我不确定到底是什么问题。@RaggaMuffin-420这与线程有什么关系?我倾向于说,这是无法实现的。但我仍然不知道,尽管可以在stdin的句柄上调用fclose,但不能真正关闭它,因为php解释器仍然维护stdin。这个答案显然是错误的,在任何情况下都不优雅。你能解释一下它是如何工作的吗?至少这个例子不起作用: