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);

不过要注意的一件事(我对此不确定)是它可能feof()是“阻塞”的检查 - 可能是循环永远不会结束,因为子进程没有关闭其 STDOUT 描述符。

于 2012-12-19T14:03:21.410 回答