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