CURL
curl是利用URL语法在命令行方式下工作的开源文件传输工具。
1。获得页面
使用命令:curl 页面的地址 例如:curl www.baidu.com
用这个命令获得了www.baidu.com指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将不显示文件头部,即HTML文档的header。要全部显示,请加参数 -i,要只显示头部,用参数 -I。任何时候,可以使用 -v 命令看curl是怎样工作的,它向服务器发送的所有命令都会显示出来。为了 断点续传 ,可以使用-r参数来指定传输范围。
2.获取表单
curl “表单提交地址+传递的参数”。例: curl "www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK"。
2.2 post方法的表单:
curl -d "参数" 表单提交地址 例:curl -d "birthyear=1905&press=OK" www.hotmail. com/when/junk.cgi
2.3 上传文件:
curl -F upload=@localfilename -F press=ok 地址
2.4 使用PUT:
curl -T uploadfile 地址
2.5 相关认证:
curl可以处理各种情况的认证页面,例如下载用户名/密码认证方式的页面(在IE中通常是出现一个输入用户名和密码的输入框):curl -u name:password www.secrets. com
如果网络是通过http代理服务器出去的,而代理服务器需要用户名和密码,那么输入:
curl -U proxyuser:proxypassword http://curl.haxx. se
任何需要输入用户名和密码的时候,只在参数中指定用户名而空着密码,curl可以交互式的让用户输入密码。
2.6 引用:
curl -e http://curl.haxx.se daniel.haxx.se
2.7 指定用户端:
有些网络资源首先需要判断用户使用的是什么浏览器,符合标准了才能够下载或者浏览。此时curl可以把自己“伪装”成任何其他浏览器:
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" URL 这个指令表示curl伪装成了IE5.0,用户平台是Windows 2000。(对方服务器是根据这个字串来判断客户端的类型的,所以即使使用AIX也无所谓)。
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" URL 此时curl变成了Netscape,运行在PIII平台的Linux上了。
2.8 COOKIES:
Cookie是服务器经常使用的一种记忆客户信息的方法。如果cookie被记录在了文件中,那么使用命令:
curl -b stored_cookies_in_file www.cookiesite. com
curl可以根据旧的cookie写出新cookie并发送到网站:
curl -b cookies.txt -c newcookies.txt www.cookiesite. com
2.9 加密HTTP:
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:curl https://that.secure.server. com
2.10 http认证:
如果是采用证书认证的http地址,证书在本地,那么curl这样使用:curl -E mycert.pem https://that.secure.server. com
2.11 这里推荐几个读物:
RFC 2616 HTTP协议语法的定义。RFC 2396 URL语法的定义。RFC 2109 Cookie是怎样工作的。RFC 1867 HTTP如何POST,以及POST的格式。
3. PHP cURL函数列表
二、 curl的简单使用
1. 初始化
2. 设置请求选项
3. 执行一个cURL会话并且获取相关回复
4. 释放cURL句柄,关闭会话
//初始化一个cURL会话
//设置请求选项,包括具体的url
//注:更多的选项设置参考:http://cn2.php.net/manual/zh/function.curl-setopt.php
//执行一个curl会话并获取相关回复
//获取curl请求的具体信息,结果为关联数组(打印出来,自行观看),请参考: http://cn2.php.net/manual/zh/function.curl-getinfo.php
//抛出异常
//释放curl句柄,关闭curl会话
1. 使用curl发送post请求
2. 文件上传
3. 文件下载
3.2 大型文件的下载
4. http验证
5. 通过代理发送请求
6. 发送json数据
用这个命令获得了www.baidu.com指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将不显示文件头部,即HTML文档的header。要全部显示,请加参数 -i,要只显示头部,用参数 -I。任何时候,可以使用 -v 命令看curl是怎样工作的,它向服务器发送的所有命令都会显示出来。为了 断点续传 ,可以使用-r参数来指定传输范围。
2.获取表单
<form method="GET" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value="OK">
</form>
2.1 get方法的表单:
curl “表单提交地址+传递的参数”。例: curl "www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK"。
2.2 post方法的表单:
curl -d "参数" 表单提交地址 例:curl -d "birthyear=1905&press=OK" www.hotmail. com/when/junk.cgi
2.3 上传文件:
curl -F upload=@localfilename -F press=ok 地址
2.4 使用PUT:
curl -T uploadfile 地址
2.5 相关认证:
curl可以处理各种情况的认证页面,例如下载用户名/密码认证方式的页面(在IE中通常是出现一个输入用户名和密码的输入框):curl -u name:password www.secrets. com
如果网络是通过http代理服务器出去的,而代理服务器需要用户名和密码,那么输入:
curl -U proxyuser:proxypassword http://curl.haxx. se
任何需要输入用户名和密码的时候,只在参数中指定用户名而空着密码,curl可以交互式的让用户输入密码。
2.6 引用:
curl -e http://curl.haxx.se daniel.haxx.se
2.7 指定用户端:
有些网络资源首先需要判断用户使用的是什么浏览器,符合标准了才能够下载或者浏览。此时curl可以把自己“伪装”成任何其他浏览器:
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" URL 这个指令表示curl伪装成了IE5.0,用户平台是Windows 2000。(对方服务器是根据这个字串来判断客户端的类型的,所以即使使用AIX也无所谓)。
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" URL 此时curl变成了Netscape,运行在PIII平台的Linux上了。
2.8 COOKIES:
Cookie是服务器经常使用的一种记忆客户信息的方法。如果cookie被记录在了文件中,那么使用命令:
curl -b stored_cookies_in_file www.cookiesite. com
curl可以根据旧的cookie写出新cookie并发送到网站:
curl -b cookies.txt -c newcookies.txt www.cookiesite. com
2.9 加密HTTP:
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:curl https://that.secure.server. com
2.10 http认证:
如果是采用证书认证的http地址,证书在本地,那么curl这样使用:curl -E mycert.pem https://that.secure.server. com
2.11 这里推荐几个读物:
RFC 2616 HTTP协议语法的定义。RFC 2396 URL语法的定义。RFC 2109 Cookie是怎样工作的。RFC 1867 HTTP如何POST,以及POST的格式。
3. 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() | 返回描述错误码的字符串文本。 |
curl_pause() | 暂停及恢复连接。 |
curl_reset() | 重置libcurl的会话句柄的所有选项。 |
curl_setopt_array() | 为cURL传输会话批量设置选项。 |
curl_setopt() | 设置一个cURL传输选项。 |
curl_share_close() | 关闭cURL共享句柄。 |
curl_share_init() | 初始化cURL共享句柄。 |
curl_share_setopt() | 设置一个共享句柄的cURL传输选项。 |
curl_strerror() | 返回错误代码的字符串描述。 |
curl_unescape() | 解码URL编码后的字符串。 |
curl_version() | 获取cURL版本信息。 |
二、 curl的简单使用
1. 初始化
2. 设置请求选项
3. 执行一个cURL会话并且获取相关回复
4. 释放cURL句柄,关闭会话
//初始化一个cURL会话
$ch = curl_init();
//设置请求选项,包括具体的url
curl_setopt($ch, CURLOPT_URL, "http://www.360weboy.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
//注:更多的选项设置参考:http://cn2.php.net/manual/zh/function.curl-setopt.php
//执行一个curl会话并获取相关回复
$response = curl_exec($ch);
//获取curl请求的具体信息,结果为关联数组(打印出来,自行观看),请参考: http://cn2.php.net/manual/zh/function.curl-getinfo.php
$curl_info = curl_getinfo($ch);
//抛出异常
if ($response === false) {
echo 'cURL错误信息:'.curl_error($ch);
}
//释放curl句柄,关闭curl会话
curl_close($ch);
1. 使用curl发送post请求
$url = 'www.baidu.com';
$post_data = ............;
//设置请求选项(如上)
//设置Post请求类型
curl_setopt($ch, CURLOPT_POST, 1);
//添加数据到请求中
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
2. 文件上传
$post_data = array('attachment' => "@1.jpg");
3. 文件下载
//保存到本地的文件路径
$path = 'local/....';
.
.
//将文件内容写入本地文件
$path = 'local/path/to/test.zip';
3.2 大型文件的下载
$url = 'http://www.360weboy.com/test.zip';
$path = 'local/path/to/test.zip';
// 打开本地文件
$fp = fopen($path, 'w');
// 告诉curl本地文件句柄
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);
在上述代码中,我们先打开个本地文件,并将文件句柄设置到curl中,然后让curl一边读取远程数据,一边写入到本地文件中。因为我们不需要在程序中获取远程回复的内容了,所以只要执行请求就可以。
4. http验证
$url = "http://www.360weboy.com/users/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 设置用户名以及密码
curl_setopt($ch, CURLOPT_USERPWD, "username:password");
// 设置重导向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
$response = curl_exec($ch);
curl_close($ch);
5. 通过代理发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.360weboy.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 设置代理ip地址
curl_setopt($ch, CURLOPT_PROXY, '222.73.173.50:8080');
// 要验证的话,这里设置用户名以及密码
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'username:password');
$response = curl_exec($ch);
curl_close ($ch);
6. 发送json数据
$url = 'http://www.360weboy.me/json.php';
// 建立json字符串
$data = array('site' => '360weboy', 'url' => 'http://www.360weboy.com','email'=>'360weboy@gmail.com');
$json_string = json_encode($data);
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 通过post请求发送上述json字符串
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, array('data'=>$json_string));
$response = curl_exec($ch);
curl_close($ch);
echo $response;