有没有办法使用PHP获取cURL请求的标题和正文?我发现这个选项:
curl_setopt($ch, CURLOPT_HEADER, true);
Run Code Online (Sandbox Code Playgroud)
将返回身体加上标题,但后来我需要解析它以获取身体.有没有办法以更有用(和更安全)的方式获得两者?
请注意,对于"单个请求",我的意思是避免在GET/POST之前发出HEAD请求.
ibl*_*lue 445
其中一个解决方案发布在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);
Run Code Online (Sandbox Code Playgroud)
警告:如下面的注释所述,当与代理服务器一起使用或处理某些类型的重定向时,这可能不可靠.@ Geoffrey的回答可能会更可靠地处理这些问题.
Geo*_*rey 168
提供此线程的许多其他解决方案都没有正确执行此操作.
\r\n\r\n
当CURLOPT_FOLLOWLOCATION
打开或服务器以100代码响应时,拆分不可靠.\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;
$headers[strtolower(trim($header[0]))][] = trim($header[1]);
return $len;
}
);
$data = curl_exec($ch);
print_r($headers);
Run Code Online (Sandbox Code Playgroud)
Ska*_*acc 113
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);
Run Code Online (Sandbox Code Playgroud)
上面的内容适用于所有内容,不同的协议和代理,您不必担心标题大小,或设置许多不同的curl选项.
PS:要使用对象方法处理标题行,请执行以下操作:
curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$object, 'methodName'))
Run Code Online (Sandbox Code Playgroud)
use*_*143 40
这是你想要的?
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
$response = curl_exec($ch);
list($header, $body) = explode("\r\n\r\n", $response, 2);
Run Code Online (Sandbox Code Playgroud)
小智 10
只需设置选项:
CURLOPT_HEADER,0
CURLOPT_RETURNTRANSFER,1
并使用curl_getinfo和CURLINFO_HTTP_CODE(或者没有opt param,你将拥有一个包含你想要的所有信息的关联数组)
更多内容:http://php.net/manual/fr/function.curl-getinfo.php
如果你特别想要Content-Type
,有一个特殊的cURL选项来检索它:
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
Run Code Online (Sandbox Code Playgroud)