获取响应头部所有信息,核心代码信息
/**
* 获取相应头部信息
*/
public function curlPostHeader($url,$postData, $options = array()){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER,$options);
// 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
curl_setopt($ch, CURLOPT_HEADER, true);
//
// 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
curl_setopt($ch, CURLOPT_NOBODY, true);
// 使用上面定义的 ua
// curl_setopt($ch, CURLOPT_USERAGENT,$user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 不同的点 开始 为 false
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
// 不同的点 结束
$data = curl_exec($ch);
curl_close($ch);
// print_r( $data);exit;
return $data;
}
具体调用业务场景信息【注意参数内容自行修改】
/**
* 获取头像信息
*/
public function get_visitor_pic($response){
//请求参数
$sign = $this->get_sign($response,$this->visitor_pic_url);
$options = array(
"Accept:".$this->accept,
"Content-Type:".$this->content_type,
"x-Ca-Key:".$this->app_key,
"X-Ca-Signature:".$sign,
"X-Ca-Timestamp:".$this->time,
"X-Ca-Signature-Headers:"."x-ca-key,x-ca-timestamp",
);
$result = $this->curlPostHeader($this->pre_url.$this->visitor_pic_url,json_encode($response),$options);
return $result;
}
对get_visitor_pic得到的 结果 ,进行数据处理 【得到 header Location地址】strpos(字符串,'判断是否存在的字符串') 返回 false 则不存在
/** 调用上述封装的方法 **/
if(strpos($pic_img,"Location:") !== false){
$pic_img = str_replace("Location:",'@@@@@',$pic_img);
$pic_img = str_replace("X-Application-Context:",'@@@@@',$pic_img);
$result = explode('@@@@@',$pic_img);
$str = trim($result[1]);
if($str != ''){
/** 注意 此处将https 验证关闭 ,如若不设置 ,对应 get_headers 将报错 **/
stream_context_set_default( [
'ssl' => [
'verify_host' => false,
'verify_peer' => false,
'verify_peer_name' => false,
],
]);
$header = get_headers($str, 1);
$temp_data['picture'] = $header;
$header = get_headers($str, 1);
$temp_data['picture'] = $header;
}else{
$temp_data['picture'] = '';
}
}
总结 使用 PHP CURL 获取响应头部信息
//1. 注意 curl中的配置信息
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER,$options);
// 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
curl_setopt($ch, CURLOPT_HEADER, true);
//
// 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
curl_setopt($ch, CURLOPT_NOBODY, true);
// 使用上面定义的 ua
// curl_setopt($ch, CURLOPT_USERAGENT,$user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数
//https请求 不验证证书和host
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//2. 得到 header location 的内容后, 关闭https验证信息,获取真正的url地址信息
$header = 'https://www.baidu.com';
$header = str_replace("Location:",'@@@@@',$header);
$header = str_replace("X-Application-Context:",'@@@@@',$header);
$result = explode('@@@@@',$header);
//3.关闭 get_headers()方法的 https 验证信息 ,很重要 不然get_headers()方法报错
stream_context_set_default( [
'ssl' => [
'verify_host' => false,
'verify_peer' => false,
'verify_peer_name' => false,
],
]);
$header = get_headers($result, 1);
//4. 字符串是否存在某个字符串
strpos(字符串,'判断是否存在的字符串') 返回 false 则不存在
扩展 【获取最终的url地址时,根据响应状态码获取不同 判断得到的最终的URL地址 】
(版权声明:此处引用「hldh214」的原创文章
原文链接:https://blog.csdn.net/hldh214/article/details/51549740)
// 此处 参考自文章 https://blog.csdn.net/hldh214/article/details/51549740 CSDN博主「hldh214」的原创文章
$header = get_headers($url, 1);
//print_r($header);
if (strpos($header[0], '301') !== false || strpos($header[0], '302') !== false) {
// 检测到跳转
if (array_key_exists('Set-Cookie', $header)) {
// 检测到cookie, 进行设置
$cookies = $header['Set-Cookie'];
foreach ($cookies as $k => $v) {
header('Set-Cookie: ' . $v);
}
}
if (array_key_exists('Location', $header)) {
$url = $header['Location'];
if (is_array($url)) {
foreach ($url as $k => $v) {
if (strpos($v, $rule) !== false) {
// 跳转地址与$rule匹配, 返回该地址
return $v;
} else {
// 不匹配则访问一次中转网址
file_get_contents($v);
}
}
} else {
if (strpos($url, $rule) !== false) {
// 跳转地址与$rule匹配, 返回该地址
return $url;
}
}
}
}