1、cURL库

  1. 全称:Client URL,客户端URL,用于与各种的服务器使用各种类型的协议进行连接和通讯;
  2. 目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议;
    同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证
  3. 需要安装libcurl库(可使用php_info函数判断是否有安装,一般都有的)

2、常用函数

  • curl_init():初始化一个cURL会话;
  • curl_setopt():设置属性,例如:curl_setopt($ch,CURLOPT_URL,‘www.example.com’),意思是设置请求的URL;
  • curl_exec():执行一个cURL会话
  • curl_close():关闭一个cURL会话

 

3、常用参数设置

  • 设置头信息,例如
$header = ['Content-Type:appliction/json; charset=utf-8'];
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
  • 设置POST数据,例如:
curl_setopt($curl, CURLOPT_POST, 1);
$post_data = array(
 "username" => "coder",
 "password" => "12345"
 );
 curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
  • 设置请求超时时间,例如:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
  • 设置响应超时时间,例如:
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
  • 设置响应HEADER返回方式,例如:0:不输出头信息,1:输出头信息
curl_setopt($ch, CURLOPT_HEADER, 1);
  • 设置返回响应结果,例如:0:直接输出,1:返回字符串
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0)
  • 设置ssl连接,有两种方式,一是直接关闭验证(不安全),二是指定本地证书文件,例如:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_CAINFO, "./static/cacert.pem");
下载各个主要CA机构的公钥证书

 

4、封装常用get与post请求

  • GET请求
/**
 * curl GET请求, api接口请求使用
 * 
 * @param string $url 请求URL
 * @param int $connect_time_out 请求超时时间,默认3,为0时不超时
 * @param int $time_out 返回超时时间,默认10,为0时不超时
 * @return mixed
 */
function api_curl_get($url, $connect_time_out = 3, $time_out = 10) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $connect_time_out);
    curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        die(curl_error($ch));
    }
    curl_close($ch);

    return $response;
}

  • POST请求
/**
 * curl POST请求, api接口请求使用
 * 
 * @param string $url 请求URL
 * @param string $postData 请求post数组
 * @param int $connect_time_out 请求超时时间,默认3,为0时不超时
 * @param int $time_out 返回超时时间,默认10,为0时不超时
 * @return mixed
 */
function api_curl_post($url, $postData, $connect_time_out = 3, $time_out = 10) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $connect_time_out);
    curl_setopt($ch, CURLOPT_TIMEOUT, $time_out);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
    $response = curl_exec($ch);
    if (curl_errno($ch)) {
        die(curl_error($ch));
    }
    curl_close($ch);

    return $response;
}

参考文章

PHP CURL SSL 连接的正确姿势

php中cURL会话的curl_setopt的CURLOPT_HEADER和CURLOPT_RETURNTRANSFER参数的使用

欢迎留言