技术&日志

PHP之CURL

PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务器、使用各种协议。libcurl 目前支持的协议有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同时支持 HTTPS 证书、HTTP POST、HTTP PUT、 FTP 上传(也能通过 PHP 的 FTP 扩展完成)、HTTP 基于表单的上传、代理、cookies、用户名+密码的认证。 [转自官方文档]

常用参数

  • CURLOPT_TIMEOUT 允许 cURL 函数执行的最长秒数

  • CURLOPT_URL 需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。

  • CURLOPT_RETURNTRANSFER TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。

  • CURLOPT_SSL_VERIFYPEER FALSE 禁止 cURL 验证对等证书(peer’s certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。(自cURL 7.10开始默认为 TRUE。从 cURL 7.10开始默认绑定安装。)

  • CURLOPT_SSL_VERIFYHOST 设置为 1 是检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。 设置成 2,会检查公用名是否存在,并且是否与提供的主机名匹配。 0 为不检查名称。 在生产环境中,这个值应该是 2(默认值)。[值 1 的支持在 cURL 7.28.1 中被删除了。]

  • CURLOPT_HTTPHEADER 设置 HTTP 头字段的数组。格式: array(‘Content-type: text/plain’, ‘Content-length: 100’)

  • CURLOPT_POST TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。

  • CURLOPT_POSTFIELDS 全部数据使用HTTP协议中的 “POST” 操作来发送。 要发送文件,在文件名前面加上@前缀并使用完整路径。 文件类型可在文件名后以 ‘;type=mimetype’ 的格式指定。 这个参数可以是 urlencoded 后的字符串,类似’para1=val1&para2=val2&…’,也可以使用一个以字段名为键值,字段数据为值的数组。 如果value是一个数组,Content-Type头将会被设置成multipart/form-data。 从 PHP 5.2.0 开始,使用 @ 前缀传递文件时,value 必须是个数组。 从 PHP 5.5.0 开始, @ 前缀已被废弃,文件可通过 CURLFile 发送。 设置 CURLOPT_SAFE_UPLOAD 为 TRUE 可禁用 @ 前缀发送文件,以增加安全性。

官方手册-http_build_query

//接收一个数据或对象, 返回一个 URL 编码后的字符串
http_build_query

常用示例

GET请求

        $baseUrl = 'http://api.demo.com?';
        $appid = 'xxxxxxxxxx';
        $secret = 'xxxxxxxxxx';
        $grantType = 'authorization_code';
        $param = array(
            'appid' => $appid,
            'secret' => $secret,
            'js_code' => $code,
            'grant_type' => $grantType
        );
        $url = $baseUrl . http_build_query($param);

        //CURL请求参数
        $opts = array(
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_URL => $url,
        );

        $ch = curl_init();
        curl_setopt_array($ch, $opts);
        $data  = curl_exec($ch);
        $error = curl_error($ch);
        curl_close($ch);
        if($error) throw new \Exception('请求发生错误:' . $error);
        var_dump(json_decode($data, true));

POST请求

上传文件

相关资料

官方手册PHP之CURL