2012-12-19 30 views
3

这是我想要做的事:如何检查流是否有任何数据?

$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()

回答

5

正确的方式做,这是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描述符。

+0

需要注意的是,正如@DaveRandom所做的那样,如果您要使用NULL,您必须将其分配给一个变量,以避免传入一个非变量引用的麻烦(前三个参数被声明)。请阅读http://php.net/manual/en/function.stream-select.php上的说明 – Jeff

相关问题