简介
curl是一个非常强大的开源库,可以使用URL的语法模拟浏览器来传输数据,支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等协议都可以很好的支持,包括一些:HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,keyberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上传文件断点续传,http代理服务器管道,甚至它还支持IPv6,scoket5代理服务器,通过http代理服务器上传文件到FTP服务器等等,还可以抓取网页
您需要在php.ini中开启curl扩展才可以使用它
使用
基本步骤
先了解下它的基本步骤,分为4步
- 初始化创建会话 curl_init()
- 设置属性 curl_setopt()
- 执行并获取结果 curl_exec()
- 释放句柄 curl_close()
基础命令
1 //创建了一个curl会话资源,成功返回一个句柄
2 $ch = curl_init();
3 //设置url
4 curl_setopt($ch, CURLOPT_URL, "baidu.com");
5 //如何处理获取的信息,1(true):是以文件流的形式返回 0(false):是直接echo输出
6 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
7 //设置为post请求,1:是 0:否
8 curl_setopt($ch, CURLOPT_POST,1);
9 //请求默认超时时间
10 curl_setopt($ch, CURLOPT_TIMEOUT, 60);
11 //0 or false 为不检查证书 测试时候可以设置
12 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
13 //post数据的时候进行数据提交,此命令略坑。
14 //使用 curl 并且参数为数据时,向服务器提交数据时,
15 //http头会发送content_type: application/x-www-form-urlencoded。
16 //这个是正常的网页<form>提交表单时,浏览器发送的头部。
17 //而 multipart/form-data 知道这是用于上传文件的表单。包括了 boundary 分界符,会多出很多字节。
18 //在没有需要上传文件的情况下,尽量对 post 提交的数据进行 http_build_query 处理,再发送
19 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
20 // 执行,然后将响应结果存入$output变量
21 $output = curl_exec($ch);
22 //捕获句柄执行错误信息
23 $error = curl_error($ch);
24 // 关闭这个curl会话资源
25 curl_close($ch);
curl_setopt可以用curl_setopt_array()代替,并将参数以数组的形式传入
1 $opts = array(
2 CURLOPT_TIMEOUT => 60,
3 CURLOPT_RETURNTRANSFER => 1,
4 ...
5 );
6 curl_setopt_array($ch, $opts);
GET请求
1 /**
2 * GET请求
3 * @param string $url 请求路径
4 * @param array $params 请求参数数组
5 * @param int $timeout 超时时间
6 */
7 public function curlGet($url, $params = [], $timeout = 5)
8 {
9 $url = $url . "?" . http_build_query($params);
10 $ch = curl_init($url);
11 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
12 curl_setopt($ch, CURLOPT_HEADER, 0);
13 curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
14 $output = curl_exec($ch);
15 if ($output === FALSE) {
16 echo "CURL GET Error:" . curl_error($ch);
17 }
18 curl_close($ch);
19 return $output;
20 }
POST请求
1 /**
2 * POST
3 * @param string $url 请求路径
4 * @param array $params 请求参数数组
5 * @param int $timeout 超时时间
6 */
7 public static function curlPost($url, $params = [], $timeout = 5)
8 {
9 $curl = curl_init($url);
10 curl_setopt($curl, CURLOPT_HEADER, 0);
11 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
12 curl_setopt($curl, CURLOPT_POST, 1);
13 curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));
14 $data = curl_exec($curl);
15 curl_close($curl);
16 return $data;
17 }
上传图片
这里需要注意一个PHP版本的坑
在5.6版本以下在图片路径地址前加上@符号即可,而PHP5.6版本则需要使用新得方法new CURLFile(图片路径);方可执行。
或者还是用原来的方法在CURLOPT_POSTFIELDS设置项前加上CURLOPT_SAFE_UPLOAD设置项,设为FALSE。即curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
1 /**
2 * 上传图片
3 * @param string $url 上传地址
4 * @param string $params 要上传的图片的路径
5 */
6 public function uploadImg($url, $path)
7 {
8 $curlPost = array('file' => new CURLFile(realpath($path)));
9 $ch = curl_init();
10 curl_setopt($ch, CURLOPT_URL, $url);
11 curl_setopt($ch, CURLOPT_HEADER, 0);
12 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
13 curl_setopt($ch, CURLOPT_POST, 1); //POST提交
14 curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
15 $data = curl_exec($ch);
16 curl_close($ch);
17 return $data;
18 }
另一台服务器接收传过来的图片并上传到服务器
1 $path = 'img/' . date('Ymd'); // 上传路径
2 if (is_uploaded_file($_FILES['file']['tmp_name'])) { // 是否有上传文件
3 $ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION); // 获取后缀名
4 $newName = time() . mt_rand() . '.' . $ext; // 用时间戳和随机数取名
5 if (!file_exists($path)) { // 检测目录是否存在
6 if (!mkdir($path, 0775, true)) { // 创建目录
7 echo '创建目录失败';
8 exit;
9 };
10 }
11 if (move_uploaded_file($_FILES['file']['tmp_name'], $path . '/' . $newName)) { // 将上传的文件移动到新位置
12 echo '上传成功';
13 } else {
14 echo '上传失败';
15 }
16 }