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;
}

php curl 获取请求头与DNS解析的更多相关文章

  1. springcloud- FeginClient 调用统一拦截添加请求头 RequestInterceptor ,被调用服务获取请求头

    使用场景: 在springcloud中通过Fegin调用远端RestApi的时候,经常需要传递一些参数信息到被调用服务中去,比如从A服务调用B服务的时候, 需要将当前用户信息传递到B调用的服务中去,我 ...

  2. request获取请求头和请求数据

    package cn.itcast.request; import java.io.IOException; import java.io.InputStream; import java.io.Pr ...

  3. WebAPi获取请求头中对应键值

    /// <summary> /// 依据键获取请求头中值数据 /// </summary> /// <param name="request"> ...

  4. nginx 获取请求头,URL参数

    获取url参数 在 ngx_lua 中访问 Nginx 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容. 在 nginx配置中,通过$arg_PARA ...

  5. postman关联 (含获取请求头的方法)

    在Tests里面输入脚本 var jsonData = JSON.parse(responseBody);postman.setEnvironmentVariable("message&qu ...

  6. request 获取请求头

    /********************************************************servlet页面********************************** ...

  7. 入门servlet:request获取请求头数据

    @WebServlet("/RequestDemo2") public class RequestDemo2 extends HttpServlet { protected voi ...

  8. RequestFacade对象获取请求头时忽略大小写

    也许在Controller层 在RequestFacde文件中getHeader函数逻辑实现如下所示: public String getHeader(String name) { if(this.r ...

  9. 【原创】Selenium获取请求头、响应头

    本文仅供学习交流使用,如侵立删! Selenium获取请求头.响应头 操作环境 win10 . mac Python3.9 selenium.seleniumwire selenium是没有办法直接获 ...

随机推荐

  1. Codeforces 1337C Linova and Kingdom

    题意 给你一颗有根树,你要选择\(k\)个点,最大化\(\sum_{i \in S} val_i\),其中\(S\)是被选点的集合,\(val_i\)等于节点\(i\)到根的路径上未被选择点的个数. ...

  2. rank,dense_rank和row_number函数区别

    我对技术一般抱有够用就好的态度,一般在网上或者书上找了贴合的解决方案,放到实际中发现好用就行了,不再深究,等出了问题再说. 因此,我对Oracle中中形成有效序列的方法集中在rownum,row_nu ...

  3. Git 沙盒模拟实战(基础篇)

    Git 沙盒模拟实战 分支 现有一个主分支 创建分支 # 创建分支 $ git branch bugFix # 切换到指定分支 $ git checkout bugFix 或者 # 创建分支,并切换到 ...

  4. “未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决方案

    不论是连接Access数据库或是SQL Server数据库,"未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序."这个问题从Of ...

  5. Arnold变换(猫脸变换)

    Arnold变换是Arnold在遍历理论研究中提出的一种变换.由于Arnold本人最初对一张猫的图片进行了此种变换,因此它又被称为猫脸变换.Arnold变换可以对图像进行置乱,使得原本有意义的图像变成 ...

  6. Hive使用Calcite CBO优化流程及SQL优化实战

    目录 Hive SQL执行流程 Hive debug简单介绍 Hive SQL执行流程 Hive 使用Calcite优化 Hive Calcite优化流程 Hive Calcite使用细则 Hive向 ...

  7. lombok使用(给自己看的,只为不要忘记自己用过的技术)

    如何使用? 一.1)eclipse使用方法 1. 从项目首页下载lombok.jar 2. 双击lombok.jar, 将其安装到eclipse中(该项目需要jdk1.6+的环境) 2)idea使用方 ...

  8. 使用jpa时,实体类有不存在数据库中的字段

    使用jpa时,实体类有不存在数据库中的字段.在改属性上面加上这个注解@Transient就可以解决问题.

  9. php+html实现用户登录退出

    随着渗透学习,逐渐意识到了学会开发也是非常重要的,仅仅是看懂感觉还是差了一些,所以写一写php的开发,这套程序目前并未有较完整的功能,之后会不断进行完善 登录页面.html <!DOCTYPE ...

  10. 源码分析springboot自定义jackson序列化,默认null值个性化处理返回值

    最近项目要实现一种需求,对于后端返回给前端的json格式的一种规范,不允许缺少字段和字段值都为null,所以琢磨了一下如何进行将springboot的Jackson序列化自定义一下,先看看如何实现,再 ...