2010-03-24 93 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