2012-12-19 65 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

相關問題