curl详解

1.cURL介绍

  cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 库。本文将介绍 cURL 的一些高级特性,以及在PHP中如何运用它。

2.基本结构

  在学习更为复杂的功能之前,先来看一下在PHP中建立cURL请求的基本步骤:

  (1)初始化    curl_init()
  (2)设置变量   curl_setopt() 。最为重要,一切玄妙均在此。有一长串cURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的选项。
  (3)执行并获取结果 curl_exec()
  (4)释放cURL句柄 curl_close()

3.cURL实现Get和Post

3.1 Get方式实现
复制代码 代码如下:

  //初始化
  $ch = curl_init();

  //设置选项,包括URL
  curl_setopt($ch, CURLOPT_URL, "http://www.jb51.net");
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);是否输出,1捕获这个数据,不进行输出
  curl_setopt($ch, CURLOPT_HEADER, 0); //返回头信息

    //设置相应的参数绕过ssl的认证      在HTTPS页面的时候加
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);


  //执行并获取HTML文档内容
  $output = curl_exec($ch);
  //释放curl句柄
  curl_close($ch);
  //打印获得的数据
  print_r($output);

3.2 Post方式实现
复制代码 代码如下:

  $url = "http://localhost/web_services.php";
  $post_data = array ("username" => "bob","key" => "12345");
  $ch = curl_init();
    // post数据  post数据位数组格式

  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_POST, 1);
  //提交POST的数据

  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  $output = curl_exec($ch);
    //释放资源

  curl_close($ch);

  //打印获得的数据

  print_r($output);

  

  以上方式获取到的数据是json格式的,使用json_decode函数解释成数组。

  $output_array = json_decode($output,true);

  如果使用json_decode($output)解析的话,将会得到object类型的数据。

3.2.2 模拟登陆
  //curl实现模拟登陆
   定义一个文件保存cookie
    $cookie_file='aaa.txt'
    $cookie_filetempnam=('./temp','cookie')
  //登陆成功后吧信息保存在文件中
    curl_setopt($ch,CURLOPT_COKIEJAR,$cookie_file);
  //把数据从文件中读取出来
        curl_setopt($ch,CURLOPT_COOKIEFILE, $cookie_file);

3.2.3  封装curl函数
    1.提叫方式
    2.提交数据
    3.什么时候需要保存cookie
    4.什么时候读取cookie
  //var_dump($_SERVER);exit;
  $cookie_file = tempnam('./temp','cookie');  //创建cookie文件保存的位置
  //echo $cookie_file;exit;
 function  curl($url,$data=array(),$method,$setcooke=false,$cookie_file=false){
        $ch = curl_init();     //1.初始化
        curl_setopt($ch, CURLOPT_URL, $url); //2.请求地址
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);//3.请求方式
        //4.参数如下    禁止服务器端的验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        //伪装请求来源,绕过防盗
       //curl_setopt($ch,CURLOPT_REFERER,"http://wthrcdn.etouch.cn/");
       //配置curl解压缩方式(默认的压缩方式)
       curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept-Encoding:gzip'));
       curl_setopt($ch, CURLOPT_ENCODING, "gzip");

        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0'); //指明以哪种方式进行访问
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
        if($method=="POST"){//5.post方式的时候添加数据    
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        if($setcooke==true){
             //如果设置要请求的cookie,那么把cookie值保存在指定的文件中
            curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
        }else{
             //就从文件中读取cookie的信息
            curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $tmpInfo = curl_exec($ch);

        if (curl_errno($ch)) {
            return curl_error($ch);
        }
        curl_close($ch);
        return $tmpInfo;
    }
    /*
  //模拟get请求
   $url="https://www.taobao.com/";
   $str=curl($url,array(),'GET');
   //echo $str;
  //post请求
   $url="http://www.study.com/seven7/1408phpB/20160311/1.php";
   $data=array('username'=>'abc');
   $str=curl($url,$data,'POST');
   echo $str;
   */



   //模拟登陆
    //登陆保存用户信息到cookie中
    
    $url="http://www.ecshop.com/user.php";
    $data=array('username'=>'ecshop','password'=>'ecshop','remember'=>'1','act'=>'act_login','back_act'=>'./index.php','submit'=>'');
    //post提交
    curl($url,$data,'POST',true,$cookie_file);
    //get获取
    $url="http://www.ecshop.com/user.php?act=order_list";
    $str=curl($url,array(),'GET',false,$cookie_file);
    echo $str;
   



    

3.3 关于curl上传文件
在localhost根目录建立1.php如下:
复制代码
    $ch=curl_init('http://localhost/post.php');    
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // localhost:8888是fiddler的代理,设置此选项用于让fiddler抓获post的请求

    curl_setopt($ch, CURLOPT_PROXY, 'localhost:8888');
    //下面这一句必须注释,不然Fiddler抓不到Post的http请求
    //curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,
        //1.文件路径之前必须要加@
        //2.文件路径带中文就会失败,例如'img_1'=>'@C:\Documents and Settings\Administrator\桌面\Android壁纸\androids.gif'
        array('uname'=>'wqfghgfh','img_1'=>'@C:\Documents and Settings\Administrator\androids.gif')
    );
    $data=curl_exec($ch);
    curl_close($ch);
    echo $data;
?>

在localhost根目录新建post.php如下
    var_dump($_POST);
    var_dump($_FILES);
?>  

访问http://localhost/1.php,返回如下内容:

array 'uname' => string 'wqfghgfh' (length=8)
array 'img_1' => array 'name' => string 'androids.gif' (length=12) 'type' => string 'application/octet-stream' (length=24) 'tmp_name' => string 'C:\WINDOWS\Temp\php1BE.tmp' (length=26) 'error' => int 0 'size' => int 11293

你可能感兴趣的:(curl详解)