如何让fopen正常超时?

时间:2010-03-24 20:40:29

标签: php sockets fopen

我有以下的PHP代码片段

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

}
$info = stream_get_meta_data($fp);

我希望请求在1秒后超时。如果我将sleep(20)放在我正在阅读的$url中,它只会等待整整20秒而且永远不会超时。是否有更好的方法可以使用fopen进行超时?

如果我在该代码之上使用ini_set('default_socket_timeout',2)它会超时,但$info则会变为空,所以理想情况下我想使用流函数。

1 个答案:

答案 0 :(得分:10)

您可以使用stream_context_create()http context option timeout。但是,如果发生超时,fopen()仍会返回false,stream_get_meta_data()将无效。

$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);
}