2011-10-13 91 views
1

以下是我的代碼。我希望fread可以在幾秒鐘後沒有數據讀取時返回。我稱之爲stream_set_timeout。但它不起作用。我也叫stream_get_meta_data。它並沒有給我需要。我正在連接chat.facebook.com。如何在訪問套接字時將fread設置爲超時?

$fp = fsockopen($server, 8888, $errno, $errstr); 

stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); 

fwrite($fp, $xml); 

stream_set_timeout($fp, 5); 

$str = fread($fp,8192);//This code will hang when there don't have data to read. 

回答

1

如果你閱讀手冊爲stream_set_timeout()你知道的唯一的事stream_set_timeout()確實在超時的情況下,通過設置返回stream_get_meta_data()爲true的數組「TIMED_OUT」鍵。

stream_set_timeout($fp, 5); 
// set stream into non-blocking mode 
stream_set_blocking($fp, false); 

$break_counter = 0; 
$result = ''; 
$info = stream_get_meta_data($fp); 

while (!$info['timed_out'] && !feof($fp)) { 
    $str = @fgets($fp, 1160); 
    if ($str) { 
     $result .= $str; 
    } else { 
     $break_counter += 1; 

     if ($break_counter > 100) { 
      break; 
     } 

     // 10000*100 microseconds gives you one second 
     usleep(10000); 
    } 
    $info = stream_get_meta_data($fp); 
} 
+0

非常感謝您的代碼。我有一個問題。這些代碼在阻塞模式下工作? – user992745

+0

也許我不會說全部。當socket處於阻塞模式時,我需要fread的超時設置。 – user992745

相關問題