合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] 调试 ~~~css curl baidu.com dig baidu.com 用来DNS查询信息的小工具 ping baidu.com nslookup baidu.com nslookup www.163.com public1.114dns.com nslookup -qt=AAAA www.163.com public1.114dns.com nslookup www.163.com dns.google 即 nslookup www.163.com 8.8.8.8 ~~~ ![](https://img.kancloud.cn/28/0a/280a81de220b9ddc171b15941e77d091_665x426.png) 语法:nslookup 域名 DNS服务器, 如果是家里非域名的服务器获得结果,返回得是本地DNS缓存中获取的结果;如192.168.2.1 ![](https://img.kancloud.cn/17/0b/170b56cb29cff3fdeec8d2a24803a2d9_640x456.png) # PHP的curl查看header信息的功能(包括查看返回header和请求header) ``` echo get('http://www.baidu.com');exit; function get($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPGET, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。 $header = ['User-Agent: php test']; //设置一个你的浏览器agent的header curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_HEADER, 1); //返回response头部信息 curl_setopt($ch, CURLINFO_HEADER_OUT, true); //TRUE 时追踪句柄的请求字符串,从 PHP 5.1.3 开始可用。这个很关键,就是允许你查看请求header curl_setopt($ch, CURLOPT_URL, $url); $result = curl_exec($ch); echo curl_getinfo($ch, CURLINFO_HEADER_OUT); //官方文档描述是“发送请求的字符串”,其实就是请求的header。这个就是直接查看请求header,因为上面允许查看 curl_close($ch); return $result; } ``` ``` GET / HTTP/1.1 Host: www.baidu.com Accept: */* User-Agent: php test HTTP/1.1 200 OK Server: bfe/1.0.8.18 Date: Tue, 04 Jul 2017 01:25:19 GMT Content-Type: text/html Content-Length: 2381 Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT Connection: Keep-Alive ETag: "588604c4-94d" Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform Pragma: no-cache Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/ Accept-Ranges: bytes <!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8> ...... 后面很多,就是百度首页的所有HTML ``` # PHP 发送请求(curl) ``` <?php namespace common\publics; class Request { /** * Get请求方法(http) * @param $url * @return bool|string */ public static function getRequest($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); //返回的内容作为变量储存,而不是直接输出。 这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true curl_setopt($curl, CURLOPT_RETURNTRANSFER, 10); $data = curl_exec($curl); curl_close($curl); return $data; } /** * 请求方式 * @param $url * @param $type * @param array $data * @return bool|string */ public static function httpCurl($url,$data=[],$type="POST"){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); if($type == 'GET'){ curl_setopt($curl, CURLOPT_HEADER, 1); //设置头文件的信息作为数据流输出 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置获取的信息以文件流的形式返回,而不是直接输出 } if($type == 'POST'){ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS,$data); } $res = curl_exec($curl); curl_close($curl); return $res; } /** * curl http/https 请求 * @param string $url * @param string|array $data * @param bool $isPost * @param int $execTimes * @param bool $makeJsonStr * @return mixed|string */ public static function curlHttp($url, $data = '', $isPost = true, $execTimes = 1, $makeJsonStr = true) { // 检测是不是 https $ssl = false; $http = parse_url($url,PHP_URL_SCHEME); if('https' == $http){ $ssl = true; } // 检测 url 中是否已存在参数 $mark = strpos($url,'?'); // 处理 POST 请求的参数 $header = array(); if($isPost){ if(is_array($data) && $makeJsonStr){ $data = json_encode($data,JSON_UNESCAPED_UNICODE); } if($makeJsonStr){ $header[] = 'Content-Type: application/json'; } } // 处理 GET 请求的参数 else{ // 将参数转为请求字符串 if(is_array($data)){ $data = http_build_query($data); } $conn = '&'; if(false === $mark){ $conn = '?'; } $url .= $conn . $data; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); if($ssl){ curl_setopt($ch, CURLOPT_SSLVERSION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); } if($isPost) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } if( ! empty($header)){ curl_setopt($ch, CURLOPT_HTTPHEADER, $header); } curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # 特殊接口可能会多次请求才能得到正确返回结果,例:微信APP支付 for($i = 0 ; $i < $execTimes ; $i++){ $res = curl_exec($ch); } if (curl_errno($ch)) { $res = curl_error($ch); } curl_close($ch); return $res; } /** * 发送Json对象数据 * @param $url * @param array $data * @param $header * @return bool|string */ public static function httpCurlPostHeader($url, $data, $header) { if (is_array($data)) { $data = json_encode($data); } $curl = curl_init(); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 10);//超时时间 curl_setopt($curl, CURLOPT_HTTPHEADER, $header); $res = curl_exec($curl); curl_close($curl); return $res; } /** * 带body和header参数的请求(防沉迷请求) * @param $url * @param array $body * @param array $header * @param string $method * @return bool|string */ public static function requestCurlPostHeader($url,$body = [],$header=['Content-Type: application/json;charset=utf-8'],$method="post"){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); // https请求 不验证证书和hosts curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 从证书中检查SSL加密算法是否存在(默认不需要验证) curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); if($method == "post"){ curl_setopt($ch, CURLOPT_POST, 1); if($body){ curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); } } $ret = curl_exec($ch); curl_close($ch); return $ret; } } ``` ``` /** * url方式请求 * * @param string $url 要请求的url地址 * @param array $data 要发送的数据 存在该参数就启用post提交,否则为get请求 * @return mixed $output 返回请求的结果 */ protected function curl($url, $data = null){ // 1.创建一个新的CURL资源 $ch = curl_init(); // 2.设置URL相应的选项 curl_setopt($ch, CURLOPT_URL, $url); // 设置请求的URL地址 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出(0为直接输出,即不用echo,var_dump等就输出信息了,所以一般为1,则可以在我们需要得地方echo) //curl_setopt($ch, CURLOPT_HEADER, 0); // 启用时会将头文件的信息作为数据流输出 curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 设置cURL允许执行的最长秒数 curl_setopt($ch, CURLOPT_POST, $data ? 1 : 0); // 存在data就启用post发送 启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。 if (!empty($data)) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } $time=time(); $headerArray=array( "Content-type:application/json;charset='utf-8'", "Accept:application/json", "token:".strtoupper(md5($this->key.$time.$this->SecretKey)), "Timespan:".$time, ); curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray); //忽略证书 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1 // 3.抓去URL并将它传递给浏览器 $output = curl_exec($ch); if ($output==false) { return curl_error($ch); curl_close($ch); } /*$aStatus = curl_getinfo($ch); if(intval($aStatus["http_code"])==200){ return $sContent; }else{ return false; }*/ // 4.关闭CURL资源,并且释放系统资源 curl_close($ch); // 返回输出 return $output; } ``` # **get/post/put/patch封装** ``` <?php function geturl($url){ $headerArray =array("Content-type:application/json;","Accept:application/json"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray); $output = curl_exec($ch); curl_close($ch); $output = json_decode($output,true); return $output; } function posturl($url,$data){ $data = json_encode($data); $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json"); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return json_decode($output,true); } function puturl($url,$data){ $data = json_encode($data); $ch = curl_init(); //初始化CURL句柄 curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串 $output = curl_exec($ch); curl_close($ch); return json_decode($output,true); } function delurl($url,$data){ $data = json_encode($data); $ch = curl_init(); curl_setopt ($ch,CURLOPT_URL,$put_url); curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json')); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_POSTFIELDS,$data); $output = curl_exec($ch); curl_close($ch); $output = json_decode($output,true); } function patchurl($url,$data){ $data = json_encode($data); $ch = curl_init(); curl_setopt ($ch,CURLOPT_URL,$url); curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json')); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH"); curl_setopt($ch, CURLOPT_POSTFIELDS,$data); //20170611修改接口,用/id的方式传递,直接写在url中了 $output = curl_exec($ch); curl_close($ch); $output = json_decode($output); return $output; } ?> ``` ``` namespace util; class Curl{ protected static $instance=null; public $header=null; public $isOk=null; public $body=null; /*实例*/ private static function init(){ if(!isset(self::$instance)){ self::$instance=new static; } self::$instance->header=null; self::$instance->isOk=null; self::$instance->body=null; return self::$instance; } /** * 请求 * @param string $url * @param array $headers header格式必须为 “键: 值” * @param array $options * @param string $postData * @return \util\Curl */ public static function request($url,$headers=array(),$options=array(),$postData=null){ $instance=self::init(); $headers=is_array($headers)?$headers:array(); $options=is_array($options)?$options:array(); $options['timeout']=intval($options['timeout']); $options['timeout']=$options['timeout']>0?$options['timeout']:20; $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_setopt ( $ch, CURLOPT_TIMEOUT, $options['timeout'] ); curl_setopt ( $ch, CURLOPT_CONNECTTIMEOUT , 10 ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt ( $ch, CURLOPT_HEADER, 1 ); if($options['nobody']){ curl_setopt($ch, CURLOPT_NOBODY, true); } if($options['useragent']){ curl_setopt($ch, CURLOPT_USERAGENT, $options['useragent']); } curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE ); if(!empty($headers)&&count($headers)>0){ curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers ); } if(isset($postData)){ curl_setopt ( $ch, CURLOPT_POST, 1 ); if(is_array($postData)){ $postData=http_build_query($postData); } curl_setopt ( $ch, CURLOPT_POSTFIELDS, $postData ); } if(!empty($options['proxy'])&&!empty($options['proxy']['ip'])){ $proxyType=null; switch ($options['proxy']['type']){ case 'socks4':$proxyType=CURLPROXY_SOCKS4;break; case 'socks5':$proxyType=CURLPROXY_SOCKS5;break; default:$proxyType=CURLPROXY_HTTP;break; } curl_setopt($ch, CURLOPT_PROXYTYPE,$proxyType); curl_setopt($ch, CURLOPT_PROXY, $options['proxy']['ip']); curl_setopt($ch, CURLOPT_PROXYPORT, $options['proxy']['port']); if(!empty($options['proxy']['user'])){ curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_PROXYUSERPWD, $options['proxy']['user'].':'.$options['proxy']['pwd']); } } $body = curl_exec ( $ch ); $headerPos=strpos($body, "\r\n\r\n"); if($headerPos!==false){ $headerPos=intval($headerPos)+strlen("\r\n\r\n"); } $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $headerSize=intval($headerSize); if($headerSize<$headerPos){ $headerSize=$headerPos; } $instance->header = substr($body, 0, $headerSize); $instance->body = substr($body, $headerSize); $code=curl_getinfo($ch,CURLINFO_HTTP_CODE); $code=intval($code); if($code>=200&&$code<300){ $instance->isOk=true; }else{ $instance->isOk=false; } curl_close ( $ch ); return $instance; } public static function head($url,$headers=array(),$options=array()){ $options=is_array($options)?$options:array(); $options['nobody']=1; return self::request($url,$headers,$options); } public static function get($url,$headers=array(),$options=array()){ return self::request($url,$headers,$options); } public static function post($url,$headers=array(),$options=array(),$data=null){ return self::request($url,$headers,$options,$data?$data:''); } } ```