我想使用 proc_open 函数启动一个 CLIPS 进程,以便与 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 shell 发送多个输入时,例如:
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%。这可能是什么原因?