gpt4 book ai didi

stdin - PHP CLI 中的 STDIN 非阻塞

转载 作者:IT王子 更新时间:2023-10-29 00:05:07 29 4
gpt4 key购买 nike

有没有非阻塞的 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 年历史),所以如果无法完成,有没有人知道可以实现此目的(在 Windows 和 Linux 上)的任何粗略的黑客攻击?

最佳答案

这是我能想到的。它在 Linux 中运行良好,但在 Windows 上,只要我按下一个键,输入就会被缓冲,直到按下回车键。我不知道如何禁用流缓冲。

<?php

function non_block_read($fd, &$data) {
$read = array($fd);
$write = array();
$except = array();
$result = stream_select($read, $write, $except, 0);
if($result === false) throw new Exception('stream_select failed');
if($result === 0) return false;
$data = stream_get_line($fd, 1);
return true;
}

while(1) {
$x = "";
if(non_block_read(STDIN, $x)) {
echo "Input: " . $x . "\n";
// handle your input here
} else {
echo ".";
// perform your processing here
}
}

?>

关于stdin - PHP CLI 中的 STDIN 非阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9356152/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com