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

原文地址:https://www.cnblogs.com/qingsong/p/14342518.html