【问题标题】:PHP: get_headers set temporary stream_contextPHP:get_headers 设置临时 stream_context
【发布时间】:2012-01-15 19:00:52
【问题描述】:

我猜 PHP 的 get_headers 不允许上下文,所以我必须更改默认流上下文以仅获取请求的 HEAD。这会导致页面上的其他请求出现一些问题。我似乎无法弄清楚如何重置默认流上下文。我正在尝试类似:

$default = stream_context_get_default(); //Get default stream context so we can reset it
stream_context_set_default( //Only fetch the HEAD
      array(
    'http' => array(
       'method' => 'HEAD'
     )
  )
);
$headers = get_headers($url, 1); //Url can be whatever you want it to be
//var_dump($headers);
var_dump($default);
stream_context_set_default($default); //This doesn't work as it expects an array and not a resource pointer

有人知道解决这个问题的方法吗?

我知道有人建议使用 Curl,但我宁愿不使用这个。谢谢!

【问题讨论】:

标签: php header stream http-headers head


【解决方案1】:

我最终使用 stream_get_meta_data() 函数来获取 HTTP 标头。

我是这样实现的:

function get_headers_with_stream_context($url, $context, $assoc = 0) {
    $fp = fopen($url, 'r', null, $context);
    $metaData = stream_get_meta_data($fp);
    fclose($fp);

    $headerLines = $metaData['wrapper_data'];

    if(!$assoc) return $headerLines;

    $headers = array();
    foreach($headerLines as $line) {
        if(strpos($line, 'HTTP') === 0) {
            $headers[0] = $line;
            continue;
        }

        list($key, $value) = explode(': ', $line);
        $headers[$key] = $value;
    }

    return $headers;
}

这样称呼,

$context = stream_context_create(array('http' => array('method' => 'HEAD')));
$headers = get_headers_with_stream_context($url, $context, 1);

它在保持标准 stream_context 不变的情况下为您提供您所追求的。

请注意,如果传递的不是 http url,此函数将失败。

似乎有一个 feature request 用于 get_headers() 的附加参数,但在我写这篇文章时错误跟踪器已关闭,所以我无法在那里检查其他解决方案。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,但我只是将 file_get_contents 函数与自定义流上下文一起使用。

    我是这样实现的:

    $options = array(
                   'http' => array(
                         'method' => 'HEAD',
                         'follow_location' => 0
                    )
               );
    
    $context = stream_context_create($options);
    
    @file_get_contents($url, NULL, $context);
    
    var_dump($http_response_header);
    

    使用此上下文,file_get_contents 将仅获取标头并将填充 $http_response_header PHP 变量。

    【讨论】:

      【解决方案3】:

      我执行了以下操作,而不是接受的答案,这将在 PHP 5.3 及更高版本中运行,尽管我尚未对其进行全面测试。 (还有一个stream_context_get_params($context),但我认为这就足够了。)

      $stream_context_defaults = stream_context_get_options(stream_context_get_default());
      stream_context_set_default(
          array(
              'http' => array(
                  'method' => 'HEAD'
              )
          )
      );
      for ($i = 1; $i <= 10; $i++) {
          $headers = get_headers('http://www.example.org');
      }
      stream_context_set_default($stream_context_defaults); // reset to defaults
      

      【讨论】:

      • 这并不总是有效,stream_context_set_default() 不能用空的 $stream_context_defaults 数组“重置”。
      • 这是否记录在某处?我发布此内容是为了解决 get_headers 缺乏参数的问题。我确实意识到设置默认值而不是创建新上下文可能不是最聪明的,但我想重新使用 get_headers 方法。如果 get_headers 能够传入自定义上下文(例如 file_get_contents),那就太好了。
      • 在文档中没有清楚地看到它。通过测试弄清楚了。
      【解决方案4】:

      从 PHP 7.1.0 开始,get_headers() 现在接受第三个上下文参数。

      $context = stream_context_create(
          array(
              'http' => array('method' => 'HEAD')
          )
      );
      
      $headers = get_headers($url, true, $context);
      

      【讨论】:

        猜你喜欢
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 2011-03-27
        • 2013-10-06
        • 2017-01-11
        • 1970-01-01
        • 2011-05-21
        相关资源
        最近更新 更多