PHP中curl请求无响应

文章讲述了在PHP中使用curl进行HTTP请求时遇到的问题,特别是关于SSL验证的设置,以及不同Content-Type(如multipart/form-data,application/x-www-form-urlencoded,application/json)在POST请求中的应用。文中提供了一个curl_https函数示例,用于发起HTTPSPOST请求,并讨论了如何处理数据编码和文件上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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&para2=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;  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值