php curl 獲取請求頭與DNS解析
阿新 • • 發佈:2020-08-25
1 php-curl方法相關設定
具體方法在最下方的示例函式有相關編著, 這裡主要描述兩個小眾需求
a 設定訪問DNS解析
問題點: get請求網頁獲取返回值速度很快, 但是使用curl請求資料時, 響應速度奇慢
經排查是域名解析ip地址解析時間過長, 在curl中設定解析列表格式為
curl_setopt($ci, CURLOPT_RESOLVE, [
"host:port:ip"//示例 api.butian.net:443:101.227.27.122
]);
b 設定返回響應頭資訊
問題點: 請求時需要獲取響應頭中的token, 組裝對應token, 所以需要獲取響應頭資訊
使用 CURLOPT_HEADER 設定項, 將響應頭資訊新增到返回值中
具體設定為
curl_setopt($ci, CURLOPT_HEADER, true);
對應返回值為
string(402) "HTTP/1.1 200 OK
Server: nginx
Date: Tue, 25 Aug 2020 08:48:46 GMT
Content-Type: text/html;charset=utf-8
Connection: close
Vary: Accept-Encoding
Set-Cookie: PHPSESSID=uglau364277s7j89g2iraodj60; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Strict-Transport-Security: max-age=15768000
相對應的格式化函式也貼一下
/**
* 將header資訊格式化
* @param $header_str
* @return array
*/
public static function http_header_to_arr($header_str){
$header_list = explode("\n", $header_str);
$header_arr = [];
foreach ($header_list as $key => $value){
if(strpos($value, ':') === false){
continue;
}
list($header_key, $header_value) = explode(":", $value, 2);
$header_arr[$header_key] = trim($header_value);
}
if(isset($header_arr['Content-MD5'])){
$header_arr['md5'] = bin2hex(base64_decode($header_arr['Content-MD5']));
}
return $header_arr;
}
這裡是具體的curl請求函式,已將對應的需求作為引數編寫
/**
* 發起請求並獲取返回值
* @param string $url
* @param string $method 請求方式
* @param array|string $requestData 請求資料
* @param array $headers 請求頭 陣列
* @param string $returnFormat 返回資料當 1.預設data,返回響應體 2.header,返回響應頭資訊
* @return string
*/publicstatic function request($url, $method = 'GET', $requestData = null, $headers = null, $returnFormat = 'data') {
if (is_array($requestData)) {
$requestData = http_build_query($requestData);
}
if ('GET' == strtoupper($method) && $requestData) {
$url = $url.'?'.urlencode($requestData);
}
$headerFormat = false;
if($returnFormat == 'header'){
$headerFormat = true;
}
$ci = curl_init();
//設定解析地址 curl_setopt($ci, CURLOPT_RESOLVE, [
"api.butian.net:443:101.227.27.122"
]);
//302的也可以獲取 curl_setopt($ci, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ci, CURLOPT_URL, $url);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, true); // 不直接輸出curl_setopt($ci, CURLOPT_HEADER, $headerFormat);// 啟用時會將標頭檔案的資訊作為資料流輸出curl_setopt($ci, CURLOPT_AUTOREFERER, $headerFormat);// 當根據Location:重定向時,自動設定header中的Referer:資訊 curl_setopt($ci, CURLOPT_USERAGENT, 'FO UA V1.0');
curl_setopt($ci, CURLINFO_HEADER_OUT, true); //TRUE 時追蹤控制代碼的請求字串,從 PHP 5.1.3 開始可用。這個很關鍵,就是允許你檢視請求header curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ci, CURLOPT_TIMEOUT, (60));
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // 是否驗證ssl證書(http)curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE);// 是否驗證證書使用於此主機(http)
if ($headers) {
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
}
if ('POST' == strtoupper($method)) {
curl_setopt($ci, CURLOPT_POST, true);
curl_setopt($ci, CURLOPT_POSTFIELDS, $requestData);
}
if('PUT' == strtoupper($method)){
curl_setopt ($ci, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ci, CURLOPT_POSTFIELDS, $requestData);
}
$ret = curl_exec($ci);
//$requestHeader = curl_getinfo($ci, CURLINFO_HEADER_OUT); //檢視請求頭資訊
//note_log($requestHeader);//return $requestHeader;
$httpCode = curl_getinfo($ci,CURLINFO_HTTP_CODE); //http錯誤碼
//判斷http返回的錯誤碼
if ($httpCode != 200 ) {
$err_str = "HTTP ERR NUM: ".$httpCode . "\n";
die($err_str);
}
curl_close($ci);
return $ret;
}