php使用curl请求无反应问题
项目中碰到一次同代码不同电脑调试问题
一台电脑请求无任何响应
另一台正常响应
记录curl
最主要的是ssl去除验证+最后四项
不管"Content-Type:multipart/form-data"还是"Content-Type:application/x-www-form-urlencoded"只要采用post方式发送数据,并且在body体中的数据是数组格式,那么在接收端就可以使用$_POST获取到。
1、form-data 这种请求一般涉及到文件上传。后端对这种类型请求的处理也复杂一些。
Content-Type: multipart/form-data
2、x-www-form-urlencoded 。就是 application/x-www-form-urlencoded 把请求的内容转变成url参数的形式进行发送,如:s1=red&s2=blue,这是标准的编码格式,但在curl中却不是默认的发送方式。可以使用http_build_query ()函数将表单数据数组编码为一个字符串。
Content-Type: x-www-form-urlencoded
3、raw(text/plain application/json text/xml等)。 是以纯文本的方式发送数据,可以选择json、xml等格式。请求json格式的数据。
Content-Type: application/json
```php
<?php
/** curl 获取 https 请求
* @param String $url 请求的url
* @param object $data 要發送的数据
* @param Array $header 请求时发送的header
* @param int $timeout 超时时间,默认30s
* @param $cookie cookie
* @param $returnCookie 是否返回cookie
*/
function curl_https($url, $data=array(), $header=array(), $method = "POST", $timeout=30, $cookie='', $returnCookie=0){
$thisHeader = array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
);
$ch = curl_init();
// 跳过证书检查
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
//使用一个自定义的请求信息来代替"GET"或"HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTTP请求。有效值如"GET","POST","CONNECT"等等。也就是说,不要在这里输入整个HTTP请求。例如输入"GET /index.html HTTP/1.0 "是不正确的。
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
//需要获取的URL地址,也可以在curl_init()函数中设置。
curl_setopt($ch, CURLOPT_URL, $url);
//curl请求参数设置时,CURLOPT_HTTPHEADER设置 HTTP 头字段的数组。
curl_setopt($ch, CURLOPT_HTTPHEADER, $thisHeader);
//启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
curl_setopt($ch, CURLOPT_POST, true);
//全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1¶2=val2&...'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data。
//curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
//因header设置了application/json在入参已经转json
if($method == "POST") {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
}else{
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
if($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
//设置cURL允许执行的最长秒数。
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
//HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity","deflate"和"gzip"。如果为空字符串"",请求头会发送所有支持的编码类型
curl_setopt($ch, CURLOPT_ENCODING, '');
//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
//启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//CURL_HTTP_VERSION_NONE (默认值,让cURL自己判断使用哪个版本),CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)或CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)。
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
$response = curl_exec($ch);
if($error=curl_error($ch)){
die($error);
}
curl_close($ch);
if($returnCookie){
list($header, $body) = explode("\r\n\r\n", $response , 2);
preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);
$info['cookie'] = substr($matches[1][0], 1);
$info['content'] = $body;
return $info;
}
return $response;
}