2

我想使用 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%。这可能是什么原因?

4

0 回答 0