PHP CURL的用法及上传图片
简介
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 }