PHP封裝一個通用的CURL類方法(設定、獲取請求頭響應頭並處理)
阿新 • • 發佈:2018-12-17
通用的一個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; }