bash — Запуск шахматного движка Stockfish по сценарию php

Я думаю о создании 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

Пожалуйста, спросите меня для получения дополнительной информации об этом двигателе, если вам нужно.

Спасибо!

2

Решение

fwrite($pipes[0], "uci/n");
fwrite($pipes[0], "go movetime 5000/n");

Без / n Stockfish рассматривают это как одну команду (ucigo movetime 5000) и не распознают это.

1

Другие решения

На самом деле, ваш код работает. $ pipe [1] содержит весь вывод из stockfish …

Возможно, вам придется изменить строку

position startpos moves 5000

на другое число, так как 5000 означает 5000 мс = 5 секунд, т.е. время, когда двигатель останавливается. Попробуйте 10000, и двигатель остановится через 10 секунд и т. Д.

0