【发布时间】:2012-03-10 11:59:43
【问题描述】:
是否可以使用非阻塞的 PHP 从STDIN 读取:
我试过了:
stream_set_blocking(STDIN, false);
echo fread(STDIN, 1);
还有这个:
$stdin = fopen('php://stdin', 'r');
stream_set_blocking($stdin, false);
echo 'Press enter to force run command...' . PHP_EOL;
echo fread($stdin, 1);
但它仍然会阻塞直到fread 获得一些数据。
我注意到一些关于此问题的公开错误报告(7 年前),所以如果无法完成,是否有人知道可以完成此任务的任何粗略的 hack(在 Windows 和 Linux 上)?
【问题讨论】:
-
不确定我是否理解非阻塞行为应该是什么。如果没有等待输入标准输入的内容,
fread()是否应该返回 FALSE?它将如何与 EOF 区分开来?在我看来,您需要某种测试其他而不是fread()来确定标准输入上是否有等待数据,因为没有描述性失败。 -
@Graham
fread不会返回,即暂停脚本的执行,直到向STDIN提供输入。基本上我想要的是检查是否有任何用户输入STDIN,如果没有,请继续,或者运行其他一些东西。 -
@Graham“非阻塞”意味着
fread()应该立即返回,即使它无法读取数据量,它应该读取(第二个参数),但少于这个.在这种情况下,它应该返回一个空字符串。 @Petah 你试过fopen('php://stdin)吗?我依稀记得,我之前遇到过STDIN的问题。 -
@KingCrunch,刚刚尝试过,(根据我更新的问题),但结果相同。
-
所以...
stream_set_blocking(STDIN, false)应该发生的行为是fread()从不等待,而if (strlen(fread($stdin,1)) == 0),那么没有任何东西等待输入?