PHP cURL能够在单个请求中检索响应标头和正文吗?

有没有办法使用PHP为cURL请求获取标头和正文? 我发现这个选项:

curl_setopt($ch, CURLOPT_HEADER, true);

将返回body和headers ,但是我需要解析它以获取body。 有没有什么办法让两者都能以更有用(和安全)的方式?

请注意,对于“单个请求”,我的意思是避免在GET / POST之前发出HEAD请求。


一个解决方案发布在PHP文档注释中:http://www.php.net/manual/en/function.curl-exec.php#80442

代码示例:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// ...

$response = curl_exec($ch);

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

警告:正如以下注释中所述,与代理服务器一起使用或处理某些类型的重定向时,这可能不可靠。 @杰弗里的答案可以更可靠地处理这些问题。


Curl有一个内置的选项,称为CURLOPT_HEADERFUNCTION。 此选项的值必须是回调函数的名称。 Curl将逐行传递标题(仅标题!)到此回调函数(因此函数将针对每个标题行,从标题部分的顶部开始)。 你的回调函数可以对它做任何事情(并且必须返回给定行的字节数)。 这是一个经过测试的工作代码:

function HandleHeaderLine( $curl, $header_line ) {
    echo "<br>YEAH: ".$header_line; // or do whatever
    return strlen($header_line);
}


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.google.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "HandleHeaderLine");
$body = curl_exec($ch); 

上述内容适用于一切,不同协议和代理,您不必担心标题大小,或者设置许多不同的卷曲选项。

PS:要用对象方法处理标题行,请执行以下操作:

curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$object, 'methodName'))

许多提供此线程的其他解决方案都没有正确执行此操作。

  • CURLOPT_FOLLOWLOCATION打开时或当服务器用100代码响应时, rnrn分割不可靠。
  • 并非所有的服务器都符合标准和传输只是一个n新行。
  • 通过CURLINFO_HEADER_SIZE检测标头的大小也并不总是可靠的,特别是当使用代理或在某些相同的重定向场景中。
  • 最正确的方法是使用CURLOPT_HEADERFUNCTION

    这是一个使用PHP关闭执行此操作的非常干净的方法。 它还将所有标题转换为小写字母,以便跨服务器和HTTP版本进行一致处理。

    该版本将保留重复的标题

    这符合RFC822和RFC2616,请不要建议编辑使用mb_字符串函数,这是不正确的!

    $ch = curl_init();
    $headers = [];
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    // this function is called by curl for each header received
    curl_setopt($ch, CURLOPT_HEADERFUNCTION,
      function($curl, $header) use (&$headers)
      {
        $len = strlen($header);
        $header = explode(':', $header, 2);
        if (count($header) < 2) // ignore invalid headers
          return $len;
    
        $name = strtolower(trim($header[0]));
        if (!array_key_exists($name, $headers))
          $headers[$name] = [trim($header[1])];
        else
          $headers[$name][] = trim($header[1]);
    
        return $len;
      }
    );
    
    $data = curl_exec($ch);
    print_r($headers);
    
    链接地址: http://www.djcxy.com/p/41347.html

    上一篇: Can PHP cURL retrieve response headers AND body in a single request?

    下一篇: How to display request headers with command line curl