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?