5

これは私がやろうとしていることです:

$output = '';
$stream = popen("some-long-running-command 2>&1", 'r');
while (!feof($stream)) {
  $meta = stream_get_meta_data($stream);
  if ($meta['unread_bytes'] > 0) {
    $line = fgets($stream);
    $output .= $line;
  }
  echo ".";
}
$code = pclose($stream);

の呼び出しでスタックするため、このコードは正しくないようstream_get_meta_data()です。ストリームに読み取るデータがあるかどうかを確認する正しい方法は何ですか?ここでの重要な点は、でのロックを回避することfgets()です。

4

1 に答える 1

6

これを行う正しい方法は次のstream_select()とおりです。

$stream = popen("some-long-running-command 2>&1", 'r');
while (!feof($stream)) {
  $r = array($stream);
  $w = $e = NULL;

  if (stream_select($r, $w, $e, 1)) {
    // there is data to be read
  }
}
$code = pclose($stream);

ただし、注意すべき点の1つは(これについてはよくわかりませんが)、feof()「ブロック」しているチェックである可能性があります。子プロセスがSTDOUT記述子を閉じないため、ループが終了しない可能性があります。

于 2012-12-19T14:03:21.410 に答える