通用的一個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;
}