それは非常に単純な質問だと思いますが、私はそれにこだわっています:
いくつかのデバッグ オプションを使用して実行される外部プログラム (具体的には Exim) と通信する必要があります。Linux シェルから実行すると、次のようになります: run を実行しexim -bh 11.22.33.44
、その出力 (STDOUT と STDERR の両方) を読み取り、SMTP ダイアログからいくつかの行を入力し、Exim の出力を再度読み取り、別の SMTP 行を入力します。また、bash シェルを使用している間は問題なく動作しますが、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 からの読み取りを交換しようとしましたが、これまでのところうまくいきませんでした。
それを行う正しい方法を教えてください!