2

Windows で PHP スクリプトを使用して、チェス エンジンと通信しています。次のように接続を確立しています。

$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 を使用して) 接続を開いたり閉じたりする必要があります。

接続を常に開いたままにするにはどうすればよいですか?

4

1 に答える 1

1

stream_get_contents()これは、デフォルトでストリーム全体を一度に読み取る関数を使用しているためだと思います。
たとえば、次のように使用します。

fgets($pipes[1]);

最初の EOL までお読みください。

代わりに使用:

fgetc($pipes[1]);

一文字一文字読んで…

stream_get_contents()ストリームから読み取りたい文字数を 2 番目のパラメータで指定して、 を使い続けることもできると思います...

于 2015-01-12T13:47:43.423 に答える