7

我有以下 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随后变为空,所以理想情况下我想使用流函数。

4

1 回答 1

12

您可以使用stream_context_create()http 上下文选项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);
}
于 2010-03-24T21:01:45.723 回答