这是我想要做的事情:
$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()
处锁定。
fgets()
locks because it waits for a "new-line" character. Usestream_get_contents()
with the length argument instead:$line = stream_get_contents($stream, $meta['unread_bytes']);
- Mike Shiyan