0、参考资料
http://php.net/manual/zh/function.curl-setopt.php
http://www.blogfshare.com/php-curl-get-post.html
1、什么是CURL
cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 库。使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库。
2、基本步骤
step-1:初始化
$ch = curl_init()
step-2:设置属性
curl_setopt()
有一长串cURL参数可供设置,它们能指定URL请求的各个细节。
step-3:执行并获取结果
$output = curl_exec($ch);
step-4:释放句柄
curl_close($ch);
3、核心函数
cURL函数有很多,详情的可以参考官方文档。
下面列举出必用或者常用的函数。
curl_init: 初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址。
$ch = curl_init();
// or
$ch = curl_init($url);
curl_setopt:为一个curl设置会话参数。
curl_exec($ch):执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_close($ch):作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄。
curl_error($ch):返回当前会话最后一次错误的字符串。
4、常见重要配置
**CURLOPT_HTTPHEADER: **设置 HTTP 头字段的数组。格式: array('Content-type: text/plain', 'Content-length: 100')。这里需要注意格式,是一维数组,不是关联数组。
$headers = array("AuthToken:{$token}","Content-Type:application/x-www-form-urlencoded");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
CURLOPT_RETURNTRANSFER:TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。
CURLOPT_URL: 需要获取的 URL 地址,也可以在curl_init() 初始化会话的时候。
CURLOPT_POST: TRUE 时会发送 POST 请求,类型为
application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。
**CURLOPT_POSTFIELDS: ** 发送全部数据使用HTTP协议中的POST操作来发送。参数一般需要用http_build_query包装。
CURLOPT_TIMEOUT: 容许CURL函数执行的最长秒数。
CURLOPT_NOBODY: TRUE时将不输出BODY内容,这对判断远程文件是否存在,而不需要读取内容场景比较有用。
两种配置方式:
① 按照数组格式进行设置
$options = array(
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_HEADER =>false,
CURLOPT_POST =>true,
CURLOPT_POSTFIELDS => $post_data,
CURLOPT_TIMEOUT => $timeout,
);
$ch = curl_init($url);
curl_setopt_array($ch, $options);
② 单个属性进行设置
$options = array(
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_HEADER =>false,
CURLOPT_POST =>true,
CURLOPT_POSTFIELDS => $post_data,
CURLOPT_TIMEOUT => $timeout,
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ HEADER, false);
curl_setopt($ch, CURLOPT_ POST, true);
curl_setopt($ch, CURLOPT_ POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_ TIMEOUT, $ timeout);
5、常见demo示例
demo-1:
private function doCurlGet($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
demo-2:
function doHttpSend($url, $keysArr, $header = array()) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
if ($keysArr){//如果不是POST 会报参数错误
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($keysArr));
}
curl_setopt($ch, CURLOPT_URL, $url);
$ret = curl_exec($ch);
if($ret === false){
var_dump(curl_error($ch));exit;
}
$error = curl_error($ch);
curl_close($ch);
return $error ? $error : $ret;
}
6、curl与PHP-CLI
相关链接:https://www.zybuluo.com/a5635268/note/180515
部分demo示例如下:
① 抓取页面内容到一个文件中:
curl -o jasper.html jasper.pdmp.qq.com
# 或者
curl jasper.pdmp.qq.com > tojasper.html
② 抓具体的文件,用-O(大写的),后面的url要具体到某个文件,不然抓不下来。我们还可以用正则来抓取东西,但文件名还是得具体。
curl -O http://jasper.pdmp.qq.com/pdmp/friso/images/app/logo.png
③ 查看响应头信息。
curl -I jasper.pdmp.qq.com
④ 带参数请求。
curl -d user_id=10 http://jasper.pdmp.qq.com/pdmp/user/role
⑤ 带头部信息请求。
curl -H "Content-Type:application/x-www-form-urlencoded" -d user_id=10 http://jasper.pdmp.qq.com/pdmp/user/role
⑥ 当我们经常用curl去搞人家东西的时候,人家会把你的IP给屏蔽掉的,这个时候,我们可以用代理
curl -x 24.10.28.84:32779 -o home.html http://www.codesky.net
⑦ 通过ftp下载远程文件
curl -O http://jasper.pdmp.qq.com/pdmp/friso/styles/common.css
curl -u 用户名:密码
-O http://www.codesky.net/demo/curtain/bbstudy_files/style.css