田建娓 发表于 2023-8-10 07:50:28

用PHP封装一个强大且通用的cURL方法

用PHP封装一个强大且通用的cURL方法。
用PHP封装一个强大且通用的cURL方法。
用PHP封装一个强大且通用的cURL方法。
用PHP封装一个强大且通用的cURL方法。
/**
* @function 强大且通用的cURL请求库
* @param    $url            string      路径       如:https://example.com/a/b?key=val&k=>v
* @param    $method         string      请求方式   如:get、post、put、delete、patch、options
* @param    $payload      array|string荷载       如:['foo' => 'bar', 'upload_file' => new CURLFile(file_path)]或json{"foo":"bar"}
* @param    $request_header array         请求头   如:['Content-Type' => 'json', 'Set-Cookie' => 'foo']
* @param    $time_out       int         超时秒数   如:10,(单位:秒)
* @return   array ];
*/
function curl($url, $method = 'GET', $payload = [], $request_header = [], $time_out = 10) {
    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL, $url);

    $method = strtoupper($method);
    if ($method == 'POST') {
      curl_setopt($curl, CURLOPT_POST, true);
      curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'PUT') {
      curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT');
      curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'DELETE') {
      curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
      curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'PATCH') {
      curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
      curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if ($method == 'OPTIONS') {
      curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'OPTIONS');
      curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    } else if($method == 'HEAD') {
      curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'HEAD');
    } else {
      curl_setopt($curl, CURLOPT_HTTPGET, true);
    }

    if ((parse_url($url)['scheme'] ?? '') == 'https') {
      //防止对12306类似的使用自家的ssl证书,造成的请求失败
      //禁止验证对等证书
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
      //禁止验证主机证书
      curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    }

    if ($time_out) {
      curl_setopt($curl, CURLOPT_TIMEOUT, $time_out);
      curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $time_out);
    }

    if ($request_header) {
      //追加请求头 配置curl内容
      curl_setopt($curl, CURLOPT_HTTPHEADER, array_map(function ($key, $value) {return $key . ': ' . $value;}, array_keys($request_header), $request_header));
    }

    curl_setopt($curl, CURLOPT_HEADER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLINFO_HEADER_OUT, true);
    curl_setopt($curl, CURLOPT_VERBOSE, true);
    $response    = curl_exec($curl);
    $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $http_code   = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    $body      = substr($response, $header_size);
    $header_str= trim(substr($response, 0, $header_size));
    $header = [];

    if($header_str) {
      $header_arr= explode("\r\n", $header_str);
      foreach($header_arr as $every_header) {
            $header_temp = explode(': ', $every_header, 2);
            if(count($header_temp) == 2) {
                $header[$header_temp] = $header_temp;
            }
      }
    }

    if (curl_errno($curl)) {
      return ['status' => false, 'msg'=> curl_error($curl), 'data' => []];
    }

    curl_close($curl);

    return ['status' => true, 'msg'=> '', 'data' => ['http_code' => $http_code, 'body' => $body, 'header' => $header]];
}
来源:https://www.cnblogs.com/phpphp/p/17616492.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 用PHP封装一个强大且通用的cURL方法