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

我有一个使用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。 这个答案是完全错误的

无论如何都不优雅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值