2014-09-02 62 views
1

我有一个用PHP构建的简单的命令行工具,它工作的很好。不幸的是,我们现在有一些不太聪明的用户在处理数据时敲击键盘。如何在PHP控制台应用程序中刷新STDIN?

有没有办法刷新STDIN,所以它只能开始缓冲从我使用fgetc时的数据?

我试过打开我自己的STDIN管道,甚至通过循环通过那里有哪些作品,但不处理多个CRs冲洗缓冲区。

倒带和fseek似乎没有用PHP中的STDIN做任何事情。

似乎这将是一个普遍的问题,但没有太多。

PHP版本5.3.3

(我不希望使用ncurses的,如果我没有)

任何与fgets或龟etc会表现出我的问题。例如,如果您有提示表明某些内容处于“正在处理”状态,然后开始输入,则输入缓冲在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); 
+0

我没有得到问题。你能展示一个简单的代码示例以及它应该做什么? – hek2mgl 2014-09-02 13:07:43

+0

PHP根本就没有线程,我很好奇谁会认为在Python上编写CLI util util是一个好主意,或者Java ......用线程技术你可能不会遇到这个问题,米不能确定问题是什么.. – 2014-09-02 13:08:21

+0

@ RaggaMuffin-420这与线程有关吗? – hek2mgl 2014-09-02 13:21:11

回答

1

似乎PHP“readline”是一个很好的方法来处理这个问题,我将与它一起。

谢谢,所有!

+0

你能解释它是如何工作的吗?至少这个例子不起作用:http://pastebin.com/24d9v3HL – hek2mgl 2014-09-02 14:06:02

-2

你试过每次提示后关闭STDIN流?我认为这是Composer的写作方式。所以基本上你会去fopen()fgetc()fclose()....直到下一个提示。适用于我,但我在PHP 5.5

+0

虽然你可以在stdin的句柄上调用'fclose()',但是你不能真正关闭它,因为php解释器仍然保留stdin。这个答案显然是错误的 – hek2mgl 2014-09-02 13:16:01

+0

在任何情况下都不优雅。 – 2017-05-17 12:43:21

0

更好的后期则从来没有,但你应该能够使用stream_select

<?php 

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

?> 

基本上这将看看是否有给定的流可用,如果是从中读取数据(和做与它无关)

之后,你可以从标准输入读取得到你想要的输入

相关问题