2

cURL介绍

clipboard.png

cURL使用场景

  • 爬取网页数据和资源

  • 请求接口数据

  • 下载ftp服务器资源

  • 其他所有网络上的资源

开启扩展

  • windows下通过修改php.ini文件开启

    clipboard.png

  • 检验是否开启cURL扩展的方法

    1. 命令行输入:php -i 列出所有的php信息,然后ctrl+F搜索curl关键字,如果为enable则为开启,还可以查看curl的版本等信息。

    2. 编写一个php文件,里面输入phpinfo(),也可以打印出php信息

PHP中使用cURL

clipboard.png

使用示例

  • 爬取一个网页的内容并对其进行替换

    <?php
        $ch = curl_init(); // 初始化curl句柄
        curl_setopt($ch, CURLOPT_URL, "http://news.ifeng.com/");  // 设置URL地址
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // 执行之后不直接打印出来内容
        $res = curl_exec($ch);  // 执行
        curl_close($ch);  // 关闭curl句柄
        echo str_replace("台湾", "中国台湾省", $res);  // 替换指定内容后输出
  • 获取XML数据并解析为数组

    <?php
    // libxml_disable_entity_loader(false);
    $data = "theCityName=杭州";  // 传递的参数数据
    $ch = curl_init(); // 初始化curl句柄
    curl_setopt($ch, CURLOPT_URL, "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName");  // 设置URL地址
    curl_setopt($ch, CURLOPT_HEADER, 0); // 不显示header
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  // 执行之后不直接打印出来内容
    curl_setopt($ch, CURLOPT_POST, 1);  // 采用post方式请求
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  // 将要post的数据传递过去
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded;charset=utf-8", "Content-length:".strlen($data), "X-FORWARDED-FOR:111.222.333.4", "CLIENT-IP:111.222.333.4"));  // 设置http头部信息,并构造了一个虚拟ip,防止ip封杀
    // curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11");
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);  // 带上user_agent,否则可能会被查出来是爬虫,加上可能他就认为是浏览器
    $res = curl_exec($ch);  // 执行
    
    // 执行成功返回信息,执行失败显示错误
    if (!curl_errno($ch)) {
        //  如果是加载一个xml文件,用simplexml_load_file
        $xmlObj = simplexml_load_string($res);
        $jsonData = json_encode($xmlObj);
        $arr = json_decode($jsonData,true);
    
        foreach($arr as $val) {
          foreach($val as $k => $v) {
              echo "{$k} => {$v}<br>";
          }
        }
    } else {
        echo "cURL error: " . curl_error($ch);
    }
    
    curl_close($ch);  // 关闭curl句柄
  • 模拟登陆获取用户中心数据

    <?php
    $data = 'username=xxxxxx@qq.com&password=xxxxxx&remember=1';
    $ch = curl_init();  // 初始化
    curl_setopt($ch, CURLOPT_URL, "http://www.imooc.com/user/login");  // 设置访问网页的URL
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // 执行之后不直接打印出来
    // cookie相关设置,这部分设置需要在所有会话开始之前设置
    date_default_timezone_set('PRC');  // 使用cookie必须先设置时区
    curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  // 这样能让curl跟踪页面跳转
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded;charset=utf-8",
        "Content-length: ".strlen($data)
        ));
    curl_exec($ch);  // 执行
    curl_setopt($ch, CURLOPT_URL, "http://www.imooc.com/space/index");
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type:text/xml"));
    $output = curl_exec($ch);
    curl_close($ch);
    echo $output;
    ?>
  • 下载ftp服务器上面的资源

    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "ftp://192.168.1.100/downloaddemo.txt");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,  1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 300);  // 超时自动结束
    curl_setopt($ch, CURLOPT_USERPWD, "peter.zhou:123456");  // ftp的用户名和密码,冒号分割
    $outfile = fopen('dest.txt', 'wb'); // 保存到本地的文件名
    $rtn = curl_exec($ch);
    fclose($outfile);
    if(!curl_errno($ch)) {
        // $info = curl_getinfo($ch);
        // print_r($info);
        echo "RETURN: " . $rtn;
    } else {
        echo 'Curl error: ' . curl_error($ch);
    }
  • 上传资源到ftp服务器

    <?php
    $ch = curl_init();
    $localfile = 'ftp01.php';
    $fp = fopen($localfile, 'r');
    curl_setopt($ch, CURLOPT_URL, "ftp://192.168.1.100/ftp01_uploaded.php");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 300);
    curl_setopt($ch, CURLOPT_USERPWD, "peter.zhou:123456");
    
    curl_setopt($ch, CURLOPT_UPLOAD, 1);
    curl_setopt($ch, CURLOPT_INFILE, $fp);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
    $rtn = curl_exec($ch);
    fclose($fp);
    if (!curl_errno($ch)) {
        echo "Uploaded successfully.";
    } else {
        echo "Curl error: " .curl_error($ch);
    }
  • 访问https资源

    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://cdn.bootcss.com/jquery/3.3.1/jquery.js");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // 执行之后不直接打印出来
    
    // 设置https支持
    date_default_timezone_set('PRC');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);  // 终止从服务器进行验证
    
    $output = curl_exec($ch);
    curl_close($ch);
    echo $output;

cURL常用函数

  • curl_init();    // 初始化cURL会话,可以传入url,也可以不传入,返回cURL会话句柄

  • curl_setport($ch, $option, $value);    // 为cURL设置一个选项

  • curl_setport_array($ch, $optionArray);    // 为cURL批量设置选项

  • curl_exec($ch);    // 执行cURL会话,返回执行结果

  • curl_errno($ch);    // 返回最后一次的错误代码,没有错误返回0

  • curl_error($ch);    // 返回当前回话最后一次错误的字符串

  • curl_close($ch);    // 关闭cURL会话

  • curl_escape($ch,$str);    // 使用URL编码当前的字符串

  • curl_unescape($ch,$str);    // 解码给定的URL字符串

  • curl_getinfo($ch);    // 获取一个cURL连接资源句柄信息,如果第二个参数传入了具体的参数,那么会只返回这一个参数的值

  • curl_version();    // 获取cURL版本信息,参数一般情况下不需要


msfang
44 声望0 粉丝

一份耕耘一份收获,天道酬勤