使用 proc_open 时如何让 STDIN 管道一直打开?
How do you keep the STDIN pipe open all the time when using proc_open?
我在 Windows 上使用 PHP 脚本与国际象棋引擎进行通信。
我按如下方式建立连接:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file","./error.log","a")
);
$resource = proc_open("stockfish.exe", $descriptorspec, $pipes, null, array());
我可以像这样向引擎发送命令:
fwrite($pipes[0], "uci" . PHP_EOL);
我这样读引擎输出:
stream_get_contents($pipes[1]);
问题是我无法读取引擎输出,直到我像这样关闭标准输入管道:
fclose($pipes[0]);
这意味着每当我想与引擎交互时,我都必须不断地打开和关闭连接(使用 proc_open)。
如何让连接一直保持打开状态?
我想这是因为您正在使用 stream_get_contents()
函数,该函数在默认情况下会一次读取整个流。
例如,如果您使用:
fgets($pipes[1]);
您读到第一个 EOL。
改用:
fgetc($pipes[1]);
你一个字一个字地读...
我想你甚至可以继续使用 stream_get_contents()
,用第二个参数指定你想从流中读取的字符数...
我在 Windows 上使用 PHP 脚本与国际象棋引擎进行通信。 我按如下方式建立连接:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file","./error.log","a")
);
$resource = proc_open("stockfish.exe", $descriptorspec, $pipes, null, array());
我可以像这样向引擎发送命令:
fwrite($pipes[0], "uci" . PHP_EOL);
我这样读引擎输出:
stream_get_contents($pipes[1]);
问题是我无法读取引擎输出,直到我像这样关闭标准输入管道:
fclose($pipes[0]);
这意味着每当我想与引擎交互时,我都必须不断地打开和关闭连接(使用 proc_open)。
如何让连接一直保持打开状态?
我想这是因为您正在使用 stream_get_contents()
函数,该函数在默认情况下会一次读取整个流。
例如,如果您使用:
fgets($pipes[1]);
您读到第一个 EOL。
改用:
fgetc($pipes[1]);
你一个字一个字地读...
我想你甚至可以继续使用 stream_get_contents()
,用第二个参数指定你想从流中读取的字符数...