通用的一个CURL类方法,设置请求头、获取响应头等! 包括将格式处理成数组格式,方便直接输出
/**
* 发送https post请求,也支持http请求,包括header请求
* @param string $url 请求域名
* @param string $data 发送数据
* @param array $headers 请求头信息
* @return string
*/
static public function httpsRequestHeaders($url, $data = null, $headers = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
//设置post请求
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
//设置请求头
if(!empty($headers)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
}
//curl_setopt($curl, CURLOPT_TIMEOUT,60);
//至关重要,CURLINFO_HEADER_OUT选项可以拿到请求头信息
curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$arr = [];
// 返回 response_header, 该选项非常重要,如果不为 true, 只会获得响应的正文
curl_setopt($curl, CURLOPT_HEADER, true);
// 是否不需要响应的正文,为了节省带宽及时间,在只需要响应头的情况下可以不要正文
//curl_setopt($curl, CURLOPT_NOBODY, true);
$arr['request'] = curl_exec($curl);
$request_header = curl_getinfo($curl);
// 获取请求头
$request_header = isset($request_header['request_header']) ? $request_header['request_header'] : '';
// 获得响应结果里的:头大小
$headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
//响应码
$arr['http_code'] = curl_getinfo($curl,CURLINFO_HTTP_CODE);
// 根据头大小去获取头信息内容(响应头)
$respon_header = substr($arr['request'], 0, $headerSize);
//获取返回值
$arr['request'] = substr($arr['request'], $headerSize);
$responCutting = explode("\n", $respon_header);
$responHeader = [];
//将respon header 处理成数组格式
foreach ($responCutting as $k => $v) {
//$v = 'Date: Mon, 20 Aug 2018 03:22:11 GMT';
if($v != ''){
$strpos = strpos($v, ":");
if(!empty($strpos) && empty(strpos("*".$v,"HTTP "))){
$startSubstr = substr($v, 0, $strpos);
$endSubstr = trim(substr($v, $strpos+1));
$responHeader[$startSubstr] = $endSubstr;
}else{
$strpos = strpos("**".$v, "HTTP");
if(!empty($strpos)){
$responHeader['Status Code'] = $v;
}
}
}
}
//将request header 处理成数组格式
$requestCutting = explode("\n", $request_header);
$requestHeader = [];
foreach ($requestCutting as $kk => $vv) {
if($vv != ''){
$strpos = strpos($vv, ":");
if(!empty($strpos) && empty(strpos("*".$vv,"HEAD ")) && empty(strpos("*".$vv,"HTTP"))){
$startSubstr = substr($vv, 0, $strpos);
$endSubstr = trim(substr($vv, $strpos+1));
$requestHeader[$startSubstr] = $endSubstr;
}
}
}
$arr['respon_headers'] = $responHeader;
$arr['request_headers'] = $requestHeader;
curl_close($curl);
return $arr;
}