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

时间:2014-09-02 13:00:43

标签: php console stdin flush command-line-interface

我有一个简单的命令行实用程序,用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);

3 个答案:

答案 0 :(得分:1)

似乎PHP“readline”是处理这个问题的好方法,我将继续使用它。

谢谢,全部!

答案 1 :(得分:1)

最好迟到,但你应该能够使用stream_select

$keluhan_group = keluhan::select(DB::raw("COUNT(*) as count ,  MONTHNAME(created_at) as month"))
    ->orderBy("created_at")
    ->groupBy(DB::raw("month(created_at)"))
    ->get()->toArray();
$chart_array = array();
foreach($keluhan_group as $data){
    $n_data = [];
    array_push($n_data,$data['month'],$data['count']);
    array_push($chart_array,$n_data);
}

$population = Lava::DataTable();
$population->addDateColumn("Month")
    ->addNumberColumn('Keluhan')
    ->addRow($chart_array);

基本上这会看到给定流上是否有可用的数据,如果是这样的话,那就读取它(并且不做任何事情)

在此之后,您可以从stdin读取以获得所需的输入

答案 2 :(得分:-2)

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