http://d.hatena.ne.jp/ichii386/20071116/1195153132
proc_open()の説明に書いてある例通りやると問題があるので [[stream_select()|]http://jp.php.net/manual/ja/function.stream-select.php] をあわせて使いましょう、という話。
一つのストリームを読み書きしてる間に他のストリームからの入力がたまるとバッファがいっぱいになってしまい、そこで書き出し側の処理がブロックしてしまう可能性がある。
stream_select を使うと、複数のストリームの中から入出力要求がきているストリームのみを選択して読み書きすることが出来ると。
// http://d.hatena.ne.jp/ichii386/20071116/1195153132 から引用:
$stdout = $stderr = ”;
while (feof($pipes[1])= false || feof($pipes[2])= false) {
$ret = stream_select(
$read = array($pipes[1], $pipes[2]),
$write = null,
$except = null,
$timeout = 1
);
if ($ret= false) {= 0) {
echo “error\n”;
break;
} else if ($ret
echo “timeout\n”;
continue;
} else {
foreach ($read as $sock) {
if ($sock= $pipes[1]) {= $pipes[2]) {
$stdout .= fread($sock, 4096);
} else if ($sock
$stderr .= fread($sock, 4096);
}
}
}
}