2010-03-24 95 views
5

嘿,我有PHP代碼下面的代碼片段如何獲得的fopen超時正確

if($fp = fopen($url, 'r')) { 
    stream_set_timeout($fp, 1); 
    stream_set_blocking($fp, 0); 

} 
$info = stream_get_meta_data($fp); 

我想請求後的1秒的超時...如果我把睡眠(20)在我正在閱讀的$ url中,僅等待整個20秒,並且永不超時。有沒有更好的方法與fopen做超時?

如果我使用ini_set('default_socket_timeout',2);在代碼之上它正確地超時,但$信息然後變爲null,所以理想情況下我想使用流功能。

感謝

+0

當連接超時時,您希望獲得的信息是什麼? – VolkerK 2010-03-24 20:52:00

回答

10

您可以使用stream_context_create()http context option timeout
但是fopen()函數,如果發生超時和stream_get_meta_data()得到行不通仍將返回false。

$url = 'http://...'; 
$context = stream_context_create(array(
    'http'=>array(
    'timeout' => 2.0 
) 
)); 
$fp = fopen($url, 'r', false, $context); 
if (!$fp) { 
    echo '!fopen'; 
} 
else { 
    $info = stream_get_meta_data($fp); 
    var_dump($info); 
} 
+0

唯一的問題是,上下文的直到php5和我寫的代碼不幸的是需要與php4兼容:( – James 2010-03-24 23:38:32

+1

該手冊說PHP 4.3.0所以你應該很好去, http: //www.php.net/manual/en/function.stream-context-create.php – 2010-03-25 08:05:34

+1

我剛剛嘗試過「超時」,但是當我選擇超時= 2時,實際需要4秒超時,如果超時= 15 ,實際上需要30秒才能超時,爲什麼? – TomSawyer 2013-10-26 15:33:13