2015/09/10

curl常用法


php curl官网说明: http://php.net/manual/zh/book.curl.php

PHP支持的由Daniel Stenberg创建的libcurl库允许你与各种的服务器使用各种类型的协议进行连接和通讯。libcurl目前支持http、https、ftp、gopher、telnet、dict、file和ldap协议。 libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。

这些函数在PHP 4.0.2中被引入。

使用cURL函数的基本思想是先使用curl_init()初始化一个cURL会话,接着你可以通过curl_setopt()设置你需要的全部选项,然后使用curl_exec()来执行会话, 当执行完会话后使用curl_close()关闭会话。


php curl函数集

函数 描述
curl_close 关闭一个cURL会话
curl_copy_handle 复制一个cURL句柄和它的所有选项
curl_errno 返回最后一次的错误号
curl_error 返回一个保护当前会话最近一次错误的字符串
curl_escape 使用 URL 编码给定的字符串
curl_exec 执行一个cURL会话
curl_file_create 创建一个 CURLFile 对象
curl_getinfo 获取一个cURL连接资源句柄的信息
curl_init 初始化一个cURL会话
curl_multi_add_handle 向curl批处理会话中添加单独的curl句柄
curl_multi_close 关闭一组cURL句柄
curl_multi_exec 运行当前 cURL 句柄的子连接
curl_multi_getcontent 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
curl_multi_info_read 获取当前解析的cURL的相关传输信息
curl_multi_init 返回一个新cURL批处理句柄
curl_multi_remove_handle 移除curl批处理句柄资源中的某个句柄资源
curl_multi_select 等待所有cURL批处理中的活动连接
curl_multi_setopt 为 cURL 并行处理设置一个选项
curl_multi_strerror Return string describing error code
curl_pause Pause and unpause a connection
curl_reset Reset all options of a libcurl session handle
curl_setopt_array 为cURL传输会话批量设置选项
curl_setopt 设置一个cURL传输选项
curl_share_close Close a cURL share handle
curl_share_init Initialize a cURL share handle
curl_share_setopt Set an option for a cURL share handle.
curl_strerror Return string describing the given error code
curl_unescape 解码给定的 URL 编码的字符串
curl_version 获取cURL版本信息

例1 使用PHP的cURL模块获取baidu.com的主页

<?php

// 创建一个新cURL资源
$ch = curl_init();
$fp = fopen("example_homepage.txt", "w");

// 设置URL和相应的选项
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/");
curl_setopt($ch, CURLOPT_FILE, $fp); //这个文件将是你放置传送的输出文件,默认是标准输出stdout
curl_setopt($ch, CURLOPT_HEADER, 0); //如果你想把一个头包含在输出中,设置这个选项为一个非零值

// 开始执行
curl_exec($ch);

//关闭cURL资源,并且释放系统资源
curl_close($ch);

//关闭文件
fclose($fp);
?>

例2 上传文件

<?php

/* http://localhost/upload.php:
print_r($_POST);
print_r($_FILES);
*/

$ch = curl_init();

$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');

curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);
?>

Note:

传递一个数组array到CURLOPT_POSTFIELDS,cURL会把数据编码成 multipart/form-data,然而传递一个URL-encoded字符串时,数据会被编码成 application/x-www-form-urlencoded


curl_setopt 常用选项

选项 描述
CURLOPT_URL 需要获取的URL地址,也可以在curl_init()函数中设置。
CURLOPT_USERAGENT 在HTTP请求中包含一个"User-Agent: "头的字符串。
CURLOPT_USERPWD 传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"。
CURLOPT_CAINFO 一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。 .
CURLOPT_CAPATH 一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。
CURLOPT_COOKIE 设定HTTP请求中"Cookie: "部分的内容。多个cookie用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")。
CURLOPT_COOKIEFILE 包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。
CURLOPT_COOKIEJAR 连接结束后保存cookie信息的文件。
CURLOPT_HTTPHEADER 一个用来设置HTTP头字段的数组。使用如下的形式的数组进行设置: array('Content-type: text/plain', 'Content-length: 100')
CURLOPT_RETURNTRANSFER 将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
CURLOPT_SSL_VERIFYPEER 禁用后 cURL将终止从服务端进行验证。使用 CURLOPT_CAINFO 选项设置证书,使用 CURLOPT_CAPATH 选项设置证书目录,如果 CURLOPT_SSL_VERIFYPEER (默认值为2)被启用, CURLOPT_SSL_VERIFYHOST 需要被设置成TRUE,否则设置为FALSE。
CURLOPT_SSL_VERIFYHOST 数值1:检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。数值2:检查公用名是否存在,并且是否与提供的主机名匹配。

例3 https请求

<?php

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://www.jb51.net");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//https请求 不验证证书
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//https请求 不验证osts

$data = curl_exec($ch);
curl_close($ch);

var_dump($data);
?>

例4 支持get post http https请求,只返回内容,不输出头信息

<?php

function get_post($url, $params=array()) {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_HEADER, 0);//如果你想把一个头包含在输出中,设置这个选项为一个非零值
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//将curl_exec()获取的信息以文件流的形式返回,而不是直接输出
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//https请求 不验证证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//https请求 不验证osts

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

$url = "https://api.weixin.qq.com/sns/auth";
$data = get_post($url);

var_dump($data);

?>