【问题标题】:How to get fopen to timeout properly?如何让 fopen 正确超时?
【发布时间】:2011-01-31 11:00:55
【问题描述】:

我有以下sn-p的php代码

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

}
$info = stream_get_meta_data($fp);

我希望请求在 1 秒后超时。如果我在我正在阅读的$url 中添加一个sleep(20),它只会等待整个 20 秒并且永远不会超时。有没有更好的方法来使用fopen 进行超时?

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

【问题讨论】:

  • 当连接超时时你期望 $info 是什么?

标签: php sockets fopen


【解决方案1】:

您可以使用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);
}

【讨论】:

  • 唯一的问题是直到 php5 才添加上下文,不幸的是我正在编写的代码需要与 php4 兼容:(
  • 手册说 PHP 4.3.0 所以你应该好好去,php.net/manual/en/function.stream-context-create.php
  • 我刚刚尝试过 "timeout" ,但是当我选择 timeout = 2 时,实际上需要 4 秒才能超时,如果 timeout = 15,实际上需要 30 秒才能超时。为什么?
  • 这里的结果相同 - 超时将加倍。
  • “加倍超时”一直是reported to the PHP project,据说它“不是错误”。维护者回复“该值既用于连接超时,又用于读取超时”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2022-01-14
  • 2018-06-04
  • 2016-01-11
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多