Я использую PHP-скрипт для Windows, чтобы общаться с шахматным движком.
Я устанавливаю соединение следующим образом:
$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]);
Проблема в том, что я не могу прочитать выходную мощность двигателя, пока не закрою канал stdin следующим образом:
fclose($pipes[0]);
Это означает, что я должен постоянно открывать и закрывать соединение (используя proc_open) всякий раз, когда я хочу взаимодействовать с движком.
Как я могу держать соединение открытым все время?
Я полагаю, это потому, что вы используете stream_get_contents()
функция, которая — по умолчанию — читает весь поток сразу.
Если вы используете, например:
fgets($pipes[1]);
Вы читаете до первого EOL.
Используя вместо этого:
fgetc($pipes[1]);
вы читаете символ за символом …
Я полагаю, вы могли бы даже продолжать использовать stream_get_contents()
указав вторым параметром количество символов, которые вы хотите прочитать из потока …
Других решений пока нет …