我想说这是一个非常简单的问题,但我坚持下去:
我需要与使用一些调试选项运行的外部程序(特别是 Exim)进行通信。当我从 linux shell 运行它时,它是这样的:运行exim -bh 11.22.33.44
,然后读取它的输出(STDOUT 和 STDERR),从 SMTP 对话框中输入某行,然后再次读取 Exim 输出,输入另一个 SMTP 行等等。它在我使用 bash shell 时运行良好,但是当我从 PHP 脚本运行它时,它卡在了 STDIN 读取循环中。
我使用proc-open
:
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", 'w'),
2 => array("pipe", 'w')
);
$process=proc_open('/usr/sbin/exim -bh 11.22.33.44', $descriptorspec, $pipes, NULL, NULL);
if (is_resource($process)) {
stream_set_blocking($pipes[1], 1);
stream_set_blocking($pipes[2], 1);
while(!feof($pipes[2])) {
$txt2 = fgets($pipes[2]);
}
while(!feof($pipes[1])) {
$txt2 = fgets($pipes[1]);
}
fwrite($pipes[0], 'HELO testhost');
...
}
看起来很简单,但在第一个 STDERR 结束时,它卡住了。
尝试了阻塞和解除阻塞模式,尝试从 STDERR 和 STDIN 交换读取 - 到目前为止没有运气。
请指出正确的方法!