我有一个使用PHP构建的简单命令行实用程序,它的功能很好。不幸的是,我们现在比精明的用户在处理数据时轻敲键盘要少得多。
有没有一种刷新STDIN的方法,以便它仅在我使用fgetc时才开始缓冲数据?
我尝试过打开自己的STDIN管道,甚至通过遍历其中的哪些内容(但不能处理多个CR)来刷新缓冲区。
倒带和fseek似乎对PHP中的STDIN没有任何作用。
似乎这将是一个普遍的问题,但没有太多。
PHP版本5.3.3
(如果不需要,我不想使用ncurses)
任何fgets或fgetc都会出现我的问题。例如,如果您有一个提示,指示某事物正在"处理中",然后开始键入内容,则输入将存储在STDIN中,因此当您稍后实际提示用户输入其内容时,会将其添加到缓冲区中。因此,如果他们在"处理"时键入" abc",然后提示您输入的内容是" abc",再加上在进入fgets或fgetc时在提示符下键入的任何内容。因此,如果有人不断按ENTER键,而您正在使用fgets(或fgetc换一个" n"),则会得到代码过早的延续。
例如:
echo"Processing";
sleep(10); // HIT ENTER A FEW TIMES HERE
echo"Input Something:";
// REALLY NEED TO FLUSH STDIN HERE SOMEHOW
fgets(STDIN);
我没有问题。 您可以显示一个简单的代码示例以及它的预期作用吗?
PHP根本没有线程,我很好奇谁认为用Python或Java在PHP上编写CLI util是一个好主意。使用线程技术,您可能不会遇到这个问题,但是我不确定到底是什么问题 是..
@ RaggaMuffin-420这和线程有什么关系?
我倾向于说,这是无法实现的。 但是我仍然不确定
最好不要迟到,但是永远可以,但是您应该可以使用stream_select
while(stream_select($in = [STDIN], $out = [], $oob = [],0)){
fgetc(STDIN);
}
?>
基本上,这将查看给定流上是否有可用数据,以及是否从中读取数据(不执行任何操作)
之后,您可以从stdin读取以获取所需的输入
似乎PHP" readline"是处理此问题的好方法,我将继续使用它。
谢谢大家!
您能解释一下它是如何工作的吗? 至少此示例不起作用:pastebin.com/24d9v3HL
您是否在每次提示后都尝试关闭STDIN流? 我认为这就是Composer的编写方式。 因此,基本上,您将使用fopen()fgetc()fclose()....,直到下一个提示。 适用于我,但我使用PHP 5.5
尽管您可以在stdin的句柄上调用fclose(),但是您不能真正关闭它,因为php解释器仍然维护stdin。 这个答案是完全错误的
无论如何都不优雅。