超好用的curl函数(PHP版本)

1 篇文章 0 订阅
1 篇文章 0 订阅

分享自己工作中总结积累的curl函数,废话不多说,直接上干货。

1.发起http请求的curl函数,post和get都ok。

/**
 * 发送curl请求
 * @param $url 'https://www.wenlin.com/'
 * @param bool $is_post true
 * @param array $data ['email' => 'xxx@xxx.com', 'password' => 'xxx']
 * @param array $header ['Content-Type:application/x-www-form-urlencoded', 'X-Requested-With:XMLHttpRequest']
 * @param bool $ssl false
 * @param bool $is_json false
 * @param int $time_out 0
 * @return array
 * @Author: 夜雨闻铃
 */
function http_curl($url, $is_post = true, $data = [], $header = [], $ssl = false, $is_json = false, $time_out = 0)
{
    $curl = curl_init();
    // 设置url
    curl_setopt($curl, CURLOPT_URL, $url);

    //json处理
    if ($is_json && $data) {
        $data = json_encode($data);
        $header = array_merge($header, ['Content-Type: application/json']);
    }
    // 将头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, false);

    // 请求结果以字符串返回,不直接输出
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    // 禁止 cURL 验证对等证书
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

    // 设置头信息
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);

    //identity", "deflate", "gzip“,三种编码方式,如果设置为空字符串,则表示支持三种编码方式。当出现乱码时,可设置此字符串
    curl_setopt($curl, CURLOPT_ENCODING, '');

    //设置http版本。HTTP1.1是主流的http版本
    curl_setopt($curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

    //如果curl版本,大于7.28.1,得是2才行,7.0版本的php自带的curl版本为7.40.1.使用php7以上的,就能确保没问题
    $ssl = $ssl ? 2 : 0;
    // 检查服务器SSL证书中是否存在一个公用名
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, $ssl);

    //连接对方主机时的最长等待时间。设置为10秒时,如果对方服务器10秒内没有响应,则主动断开链接。为0则,不限制服务器响应时间
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $time_out);

    //CURLOPT_TIMEOUT:整个cURL函数执行过程的最长等待时间,也就是说,这个时间是包含连接等待时间的
    curl_setopt($curl, CURLOPT_TIMEOUT, 0);

    if ($is_post) {
        // 设置POST请求
        curl_setopt($curl, CURLOPT_POST, true);
        // 构建参数
        if ($is_json) {
            //如果是json字符串的方式,不能用http_build_query函数
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        } else {
            //如果是数组的方式,要加http_build_query,不加的话,遇到二维数组会报错。
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
        }
    } else {
        // GET
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');

    }
    // 执行请求
    $response = curl_exec($curl);
    $content_type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE);//返回的CONTENT_TYPE类型
    $http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);//返回的http状态码

    if (curl_errno($curl)) {
        $result = [
            'HTTP_MSG' => curl_error($curl),
            'HTTP_BODY' => null,
            'HTTP_HEADER' => $content_type,
            'HTTP_CODE' => $http_code,
        ];
    } else {
        $result = [
            'HTTP_MSG' => 'SUCCESS',
            'HTTP_BODY' => json_decode($response, true),
            'HTTP_HEADER' => $content_type,
            'HTTP_CODE' => $http_code,
        ];
    }
    curl_close($curl);
    return $result;
}

2.用curl拉取文件,用get的方式拉取文件。 url等于 http://13.70.0.51:8080/static/balance.csv这种类型的。用get形式请求。


function getFileCurlTwo($url)
{
    //设置Header头
    $header[] = "Accept: application/json";
    $header[] = "Accept-Encoding: gzip";
    //添加HTTP header头采用压缩和GET方式请求
    $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_SSLVERSION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
    curl_setopt($ch,CURLOPT_ENCODING , "gzip");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    $res = curl_exec($ch);
    curl_close($ch);
    return $res;
}

3.文件拉取用curl,用post请求,data主要是带签名,提供安全性


function getFileCurl($url,$data = [])
{
    $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_SSLVERSION, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $res = curl_exec($ch);
    curl_close($ch);
    return $res;
}

例子,帮助大家理解一下

 public function getMt5File()
    {
        //先判断文件所时候已经拉取
        $file_name = "./static/file/static_bonus_cloud_" . date('Ymd', time()) . ".csv";
        if (file_exists($file_name)) {
            die('文件已存在');
        }
        //私钥
        $private_key = config('scan_private_key');
     	$find_url = config('scan_url') . '/api/adjusted_bonus';
        $data = array(
            'type' => 1,
            'bonus_date' => date('Y-m-d'),
            'timestamp' => time(),
        );
        //加密生成签名
        $sign = encryption($data, $private_key);
        $data['sign'] = $sign;
        //先查询文件是否生成
        $find_res = getFileCurl($find_url, $data);
        if ($find_res) {
            $find_res = json_decode($find_res, true);
            if ($find_res['code'] == 200 & $find_res['data']['is_grant'] == 1) {
                //文件拉取
                $file_url = config('scan_url') . '/api/get_csv';
                $file_res = getFileCurl($file_url, $data);
                //将文件,保存到对应的位置
                file_put_contents($file_name, $file_res);
            }
        }
    }

后面还会继续分享自己总结积累的心得体会。可以关注我一波,有干货时马上收到通知。如需转载此原创文章,注明一下我这个原作者即可。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值