CLIPS スクリプトと対話するために、proc_open 関数を使用して CLIPS プロセスを開始したいと考えています。したがって、次のように設定すると:
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array('pipe', 'r') // 2 is STDERR for process
);
$process = proc_open('./clips -f troubleshooter.clp', $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], '(exit)\n');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
}
すべて問題ないようです。プロセスが正しく開始および終了されている
しかし、次のように複数の入力を CLIPS シェルに送信する場合:
if (is_resource($process)) {
fwrite($pipes[0], '(run)\n');
fwrite($pipes[0], '(exit)\n');
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
}
その後、プロセスは終了せず、PHP は proc_close でハングし、システム モニターからプロセスを強制終了したときにのみ終了します。出力を確認するstream_get_contents
と、(終了) 入力がプロセスに送信されないようです。また、fclose( $pipes[0]
) を呼び出すと、CLIPS プロセスの CPU 使用率が 0% から 100% になります。この理由は何でしょうか?