Как вы сохраняете канал STDIN открытым все время при использовании proc_open?

Я использую 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) всякий раз, когда я хочу взаимодействовать с движком.

Как я могу держать соединение открытым все время?

2

Решение

Я полагаю, это потому, что вы используете stream_get_contents() функция, которая — по умолчанию — читает весь поток сразу.
Если вы используете, например:

fgets($pipes[1]);

Вы читаете до первого EOL.

Используя вместо этого:

fgetc($pipes[1]);

вы читаете символ за символом …

Я полагаю, вы могли бы даже продолжать использовать stream_get_contents()указав вторым параметром количество символов, которые вы хотите прочитать из потока …

1

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

Других решений пока нет …