Я думаю о создании php-скрипта, который открывает CLI-движок Stockfish для шахмат, посылает несколько команд и возвращает результат.
Я думаю, что могу добиться этого с помощью 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 ссылка, Ссылка на документацию по CLI
Пожалуйста, спросите меня для получения дополнительной информации об этом двигателе, если вам нужно.
Спасибо!
fwrite($pipes[0], "uci/n");
fwrite($pipes[0], "go movetime 5000/n");
Без / n Stockfish рассматривают это как одну команду (ucigo movetime 5000) и не распознают это.
На самом деле, ваш код работает. $ pipe [1] содержит весь вывод из stockfish …
Возможно, вам придется изменить строку
position startpos moves 5000
на другое число, так как 5000 означает 5000 мс = 5 секунд, т.е. время, когда двигатель останавливается. Попробуйте 10000, и двигатель остановится через 10 секунд и т. Д.