我正在考虑制作一个php脚本来打开stockfish国际象棋引擎CLI,发送少量命令并取回输出。
我想我可以通过管道数组使用proc_open
来实现这一目标,但我无法弄清楚如何等待整个输出......如果还有另一个更好的解决方案,那就太受欢迎了!
这是我的代码:
// ok, define the pipes
$descr = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$pipes = array();
// open the process with those pipes
$process = proc_open("./stockfish", $descr, $pipes);
// check if it's running
if (is_resource($process)) {
// send first universal chess interface command
fwrite($pipes[0], "uci");
// send analysis (5 seconds) command
fwrite($pipes[0], "go movetime 5000");
// close read pipe or STDOUTPUT can't be read
fclose($pipes[0]);
// read and print all output comes from the pipe
while (!feof($pipes[1])) {
echo fgets($pipes[1]);
}
// close the last opened pipe
fclose($pipes[1]);
// at the end, close the process
proc_close($process);
}
这个过程似乎开始了,但是我发送到进程的第二个STDINPUT无法等到它完成,因为第二个命令产生分析线大约5秒,结果它立即打印出来。 我该怎么做呢?
CLI link,CLI documentation link
如果您需要,请向我询问有关此引擎的更多信息。
谢谢!
答案 0 :(得分:1)
fwrite($pipes[0], "uci/n");
fwrite($pipes[0], "go movetime 5000/n");
没有/ n Stockfish将此视为一个命令(ucigo movetime 5000)并且无法识别它。
答案 1 :(得分:0)
实际上,您的代码有效。 $ pipes [1]包含了鳕鱼的所有输出......
您可能需要更改行
position startpos moves 5000
到不同的数字,因为5000意味着5000毫秒= 5秒,即。发动机停止的时间。尝试10000,发动机在10秒后停止等。
答案 2 :(得分:0)
您需要删除:"fclose($pipes[0]);"并在while循环中检查“bestmove”,如果找到bestmove - 打破循环,然后只放“fclose($pipes[0]);”。那对我有用。并在命令末尾添加“\n”分隔符。
感谢提供代码!