• php cURL示例


      1.通过curl请求url函数

    /**
     * 通过curl请求url函数,本函数用于测试curl_getinfo()的使用
     *
     * @param string $url 目标网址
     * @return string     返回网页内容
     */
    function request($url)
    {
        $ch = curl_init();                               //启动一个cURL会话
    
        curl_setopt($ch, CURLOPT_URL, $url);             //打开 URL 地址
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  //设定返回的数据是否自动显示
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);     //忽略 ssl 验证
    
        $output = curl_exec($ch);                        //执行操作
    
        //通过curl_getinfo()函数,获取服务器返回信息,并通过第二个参数 CURLINFO_HTTP_CODE 获取指定的返回状态码
        $response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);  //获取状态码,如:404、301等
    
        curl_close($ch);   //关闭会话释放资源
    
        if($response_code == '404')
        {
            echo '请求的页面不存在!';
            return false;
        }else{
            return $output;  //返回获取的网页内容
        }
    }
    
    echo request('http://test.cc/');

      2.以POST方式请求的CURL功能函数

    /**
     * 以POST方式请求的CURL功能函数
     *
     * @param $url string  请求的目标服务器地址
     * @param @data array  以 POST 方式传送到服务器的数组数据
     * @param string       返回网页内容
     */
    function request_post($url, $data)
    {
        $ch = curl_init();                            //启动一个cURL会话
    
        curl_setopt($ch, CURLOPT_URL, $url);          //要访问的地址
        curl_setopt($ch, CURLOPT_POST, 1);            //发送一个常规的 POST 请求
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  //post 提交的数据包
    
        $tmpInfo = curl_exec($ch);                    //执行操作
    
        if(curl_errno($ch))                          //判断是否有错误
        {
            echo 'Errno:' . curl_error($ch);
        }
    
        curl_close($ch);                            //关闭会话释放资源
        return $tmpInfo;                            //返回数据
    }
    
    $source = array(
        'userName' => '孙悟空',
        'age'      => '500'
    );
    
    echo request_post('http://test.cc/', $source);

      3.通过 curl 进行本地文件上传函数

    /**
     * 通过 curl 进行本地文件上传函数
     *
     * @param $url string         提交的服务器位置,需要字符串参数
     * @param $srcFilePath string 本地需要上传的文件路径,需要字符串参数
     * @param @postParam array    和上传文件一起提交给服务器的 POST 数据,需要数组参数
     * @return array              服务器返回的信息,是一个数组,下标 errno 表示状态(0 失败,1 成功),
     *                            errmsg 为反馈消息,data 为服务器返回消息
     */
    function uploadFile($url, $srcFilePath, $postParam)
    {
        //如果php为5.5以上版本,使用 CURLFile
        if(version_compare(phpversion(), '5.5.0'))
        {
            $data = array(
                'object_file' => new curlFile($srcFilePath)
            );
    
        //部署环境是5.4(仅@语法),但开发环境是5.6(仅 CURLFile)
        }else{
    
            //将需要上传的本地文件路径放入一个数组,下标相当于上传文件的表单名称,路径前一定要有“@”符号
            $data = array(
                'object_file' => '@'.$srcFilePath
            );
        }
    
        //将上传的信息和POST提交的信息合并,这样可以一起传给服务器
        $data = array_merge($postParam, $data);
    
        $ch = curl_init($url);                           //启动一个cURL会话
    
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  //设置获取的内容但不输出
        curl_setopt($ch, CURLOPT_POST, true);            //发送一个常规的 POST 请求
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);     //post 提交的数据包
        $response = curl_exec($ch);                      //执行操作
    
        if(curl_errno($ch) != 0)                         //判断是否有错误
        {
            return array('errno' => 0, 'errmsg' => "上传{$srcFilePath}失败:".curl_error($ch), 'data' => '');
        }
    
        curl_close($ch);  //关闭会话释放资源
    
        if(!$response)    //判断上传文件是否为空
        {
            return array('errno' => 0, 'errmsg' => "上传{$srcFilePath}失败:response is empty", 'data' => '');
        }
    
        return array('errno' => 1, 'errmsg' => "ok", 'data' => $response);
    }
    
    $srcFilePath = 'C:abc.jpg';
    $postParam = array('username' => '孙悟空', 'age' => '500');
    $arr = uploadFile('http://test.cc/post.php', $srcFilePath, $postParam);
    
    echo '<pre>';
    print_r($arr);  //显示信息

      4.模拟用户登录并获取数据的函数

    /**
     * 模拟用户登录函数
     * @param $url string    登录提交的地址
     * @param $cookie string 设置 cookie 信息保存的文件
     * @param $post array    提交的 post 数据
     */
    function login_post($url, $cookie, $post)
    {
        $ch = curl_init();                            //启动一个cURL会话
        curl_setopt($ch, CURLOPT_URL, $url);          //要访问的地址
        curl_setopt($ch, CURLOPT_HEADER, 0);          //设定是否显示头信息
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);  //设定返回的数据是否自动显示
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); //设置 cookie 信息保存在指定的文件中
        curl_setopt($ch, CURLOPT_POST, 1);            //1️以 post 方式提交
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));  //要提交的信息
        curl_exec($ch);                               //执行 cURL
        curl_close($ch);                              //关闭 cURL 资源,并释放系统资源
    }
    
    /**
     * 登录成功后获取数据
     * @param $url string    需要获取的内容地址
     * @param $cookie string 读取 cookie 信息保存的文件
     * @return string        抓取页面内容
     */
    function get_content($url, $cookie)
    {
        $ch = curl_init();                            //启动一个cURL会话
        curl_setopt($ch, CURLOPT_URL, $url);          //要访问的地址
        curl_setopt($ch, CURLOPT_HEADER, 0);          //设定是否显示头信息
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //设定返回的数据是否自动显示
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);  //读取 cookie
        $ret = curl_exec($ch);                        //执行 cURL
        curl_close($ch);                              //关闭 cURL 资源,并释放系统资源
        return $ret;                                  //返回内容
    }
    
    $post = array(
            'email'   => 'admin@163.com',
            'pwd'     => '123456'
    );
    
    $url = "http://test.cc/login/verify.php";
    $cookie = __DIR__.'/cookie.txt';
    $url2 = "http://test.cc/login/content.php";
    
    login_post($url, $cookie, $post);
    $content = get_content($url2, $cookie);
    @unlink($cookie);
    
    $preg = "/<p>(.*)</p>/i";
    preg_match_all($preg, $content, $arr);
    
    $str = '';
    foreach($arr[1] as $val)
    {
        $str .= $val.PHP_EOL;
    }
    
    echo $str;
    file_put_contents('save.txt', $str);

      本地测试站点的搭建

       本示例不使用真实站点来模拟,而是用本地搭建的站点来模拟,因为真实站点随时会更新,使代码不能有效执行。这里使用的是 phpstudy(小皮面板)地址:https://www.xp.cn/

      步骤,以图为例:

      

      1.C盘下存放一张图片,用于上传时作为示例,文件名为:abc.jpg

      2.目录结构:

         根目录(D:phpstudy_proWWW est.cc):

             └ uploads

                index.php

                post.php

                login

                    └ index.php

                       login.php

                       verify.php

                       content.php

      3.具体代码:

      1)login/index.php 文件:

    <?php
    header('location:login.php');

      2)login/login.php 文件:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
        <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
        <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
        <title>登录</title>
    </head>
    <body>
        <div class="container" style="height: 100vh">
            <div style="height: 22%"></div>
            <div class="row" style="height: 50%">
                <div class="col-sm-3 col-md-3 col-lg-4 col-xl-4"></div>
                <div class="col-sm-6 col-md-6 col-lg-4 col-xl-4" style="border: solid 1px #dcdcdc; padding: 20px; border-radius:10px">
                    <form action="verify.php" method="post">
                        <div class="form-group">
                            <label for="email">邮箱:</label>
                            <input type="email" class="form-control" name="email">
                        </div>
                        <div class="form-group">
                            <label for="pwd">密码:</label>
                            <input type="password" class="form-control" name="pwd">
                        </div>
                        <div class="form-check">
                            <label class="form-check-label">
                            <input class="form-check-input" type="checkbox" name="ckb"> 记住我
                            </label>
                        </div>
                        <div style="float:right">
                            <input type="submit" class="btn btn-primary" name="_submit" value="登录" />
                        </div>
                    </form>
                </div>
                <div class="col-sm-3 col-md-3 col-lg-4 col-xl-4"></div>
            </div>
        </div>
    </body>
    </html>

      3).login/verify.php 文件:

    <?php
    if(filter_has_var(INPUT_POST, "email"))
    {
        $user = $_POST['email'];
        $pass = $_POST['pwd'];
    
        if(!empty($user) && !empty($pass))
        {
            if($user === 'admin@163.com' && $pass === '123456')
            {
                session_start();
                $_SESSION['verify'] = true;
                header('location: content.php');
            }
            else
            {
                echo '<script>alert("登录错误!")</script>';
                header('location: login.php');
            }
        }
    }

      4).login/content.php 文件:

    <?php
    session_start();
    if($_SESSION['verify'] !== true)
        die('没有登录');
    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>内容</title>
    </head>
    <body>
        <div>
            <p>浪淘沙·极目楚天空</p>
            <p>幼卿 〔宋代〕</p>
            <p>极目楚天空,云雨无踪,漫留遗恨锁眉峰。自是荷花开较晚,孤负东风。</p>
            <p>客馆叹飘蓬,聚散匆匆,扬鞭那忍骤花骢。望断斜阳人不见,满袖啼红。</p>
        </div>
    </body>
    </html>

      5)./index.php 文件:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=div, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/css/bootstrap.min.css">
        <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
        <script src="https://cdn.staticfile.org/popper.js/1.15.0/umd/popper.min.js"></script>
        <script src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
        <title>测试网站</title>
    </head>
    <body>
        <h2  class="bg-info text-white" style="text-align: center; padding: 20px 0">测试网站</h2>
        <div  class="container">
            <div style="text-align: center">
                <?php if($_POST): ?>
                    <pre style="text-align: left">
                    <?php print_r($_POST) ?>
                    </pre>
                <?php else: ?>
                    <p>望海楼晚景五绝</p>
                    <p>苏轼〔宋代〕</p>
                    <p>海上涛头一线来,楼前指顾雪成堆。</p>
                    <p>从今潮上君须上,更看银山二十回。</p>
                    <p>横风吹雨入楼斜,壮观应须好句夸。</p>
                    <p>雨过潮平江海碧,电光时掣紫金蛇。</p>
                    <p>青山断处塔层层,隔岸人家唤欲应。</p>
                    <P>江上秋风晚来急,为传钟鼓到西兴。</P>
                    <P>楼下谁家烧夜香,玉笙哀怨弄初凉。</P>
                    <P>临风有客吟秋扇,拜月无人见晚妆。</P>
                    <P>沙河灯火照山红,歌鼓喧喧笑语中。</P>
                    <P>为问少年心在否,角巾欹侧鬓如蓬。</P>
                <?php endif; ?>
            </div>
        </div>
    </body>
    </html>

      6)./post.php 文件:

    <?php
        print_r($_POST);
        print_r($_FILES);
    
        /**
         * 上传文件函数
         * 
         * @param string 上传文件的本地路径
         * @return string 上传文件的服务器路径
         */
        function uploadFile($path)
        {
            if(!file_exists($path))
            {
                if(!mkdir($path, 0777))
                {
                    die('目录没有创建成功!');
                }
            }
    
            //文件类型判断,省略......
    
            $hz = array_pop(explode('.', $_FILES['object_file']['name']));
            $fileName = date('ymdHis').rand(100, 999).'.'.$hz;
            $filePath = $path.'/'.$fileName;
    
            if(is_uploaded_file($_FILES['object_file']['tmp_name']))
            {
                if(!move_uploaded_file($_FILES['object_file']['tmp_name'], $filePath))
                {
                    die('问题:不能将文件移动到指定目录。');
                }
            }
            else
            {
                die("问题:上传文件{$_FILES['object_file']['name']}不是一个合法文件。");
            }
    
            $fileMsg = str_replace(array('./', '/'), array('\', '\'), $filePath);
            return __DIR__.$fileMsg;
        }
    
        echo uploadFile('./uploads');

      4.把上面的 cURL 代码放在 http://localhost/ 站点下测试。

      注:参见官方文档:https://www.php.net/curl_setopt

  • 相关阅读:
    准备找工作了,求助于在成都的师兄、师姐们提供一些信息!大家都看看吧!
    大学课程名的中文翻译
    火箭今天赢了!!!
    如何成为一个受欢迎的人!
    理解DataSet的数据缓存机制
    餐桌上的不文雅行
    今天看到居然有100多个Gmail的邀请函,还没有Gmail的朋友留下邮箱地址!
    Update:代码行计算器(LinesCounter)
    找工作之“加班费”
    动画片里的Ajax
  • 原文地址:https://www.cnblogs.com/qingsong/p/14342518.html
Copyright © 2020-2023  润新知