前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自己写个简单的访客统计

自己写个简单的访客统计

作者头像
Blank.
发布2023-04-13 08:44:56
7980
发布2023-04-13 08:44:56
举报
文章被收录于专栏:BlankBlank
使用前言

最近想给自己网站加个访客统计,发现好多网站统计都需要付费…,这对于我们这种非营利性的网站来说无疑是不划算的,于是就自己写了个简单的网站访客统计效果如下

原创文章,转载请注明出处

效果演示:https://iu00.cn/info/visitors_text.php?type=1

lfewwl1f.png
lfewwl1f.png

这里我写了两种存储方式,一种是本地存储,一种是mysql存储

本地存储

使用方法:

新建一个.php文件将下方的代码粘贴进去,引入到你网站的全局文件中,比如<?php $this->need(‘visitors_text.php’); ?>,或者<script type=”text/javascript” src=”visitors.php”></script>,joe主题可以直接放在全局设置->自定义底部栏中

数据查询:

如果我们想查看数据只需要访问这个文件目录加上 ?type=1 即可,示例:https://域名/visitors_text.php?type=1

本地存储代码如下
代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <title>访客信息查询</title>
    <style>
        table {
            border-collapse: collapse;
            margin: auto;
            font-size: 14px;
            font-family: Arial, sans-serif;
        }
        table td, table th {
            border: 1px solid #ddd;
            padding: 8px;
        }
        table th {
            background-color: #f2f2f2;
        }
        table tr:nth-child(even) {
            background-color: #f9f9f9;
        }
    </style>
</head>
<body>
<?php
// 获取用户IP地址
$ip = $_SERVER['REMOTE_ADDR'];
// 获取用户访问浏览器
$browser = get_user_os() . " - " . get_browser_info();
// 获取用户访问页面
$page = $_SERVER['HTTP_REFERER'];
if ($page == '') {
    $page = $_SERVER['REQUEST_URI'];
}
// 记录访问时间
$visitTime = time();
// 设置数据文件路径
$dataFile = 'visitors.txt';
// 判断数据文件是否存在,如果不存在则创建
if (!file_exists($dataFile)) {
    file_put_contents($dataFile, '');
}
// 读取数据文件内容
$visitors = file_get_contents($dataFile);
if ($_GET['type'] == 1) {
    // 判断数据文件是否存在
    if (!file_exists($dataFile)) {
        echo '没有数据可显示';
        exit;
    }
    // 读取数据文件内容
    $visitors = file_get_contents($dataFile);
    // 将数据文件内容转换为数组
    $visitorsArray = array_filter(explode("\n", $visitors));
    // 按照最后访问时间排序
    usort($visitorsArray, function ($a, $b) {
        $aLastVisitTime = explode("->", $a)[4];
        $bLastVisitTime = explode("->", $b)[4];
        return $bLastVisitTime - $aLastVisitTime;
    });
    // 输出表格
    echo '<table border="1">';
    echo '<tr><th>IP地址</th><th>访问次数</th><th>浏览器</th><th>首次访问时间</th><th>最后访问时间</th><th>最后访问页面</th></tr>';
    foreach ($visitorsArray as $visitorData) {
        $visitor = explode("->", $visitorData);
        echo '<tr>';
        echo '<td>' . $visitor[0] . '</td>';
        echo '<td>' . $visitor[1] . '</td>';
        echo '<td>' . $visitor[2] . '</td>';
        echo '<td>' . date('Y-m-d H:i:s', $visitor[3]) . '</td>';
        echo '<td>' . date('Y-m-d H:i:s', $visitor[4]) . '</td>';
        echo '<td>' . $visitor[5] . '</td>';
        echo '</tr>';
    }
    echo '</table>';
} else {
    // 判断当前访问者是否已经存在于数据文件中
    $visitorExists = false;
    $visitorInfo = '';
    $visitorsArray = explode("\n", $visitors);
    foreach ($visitorsArray as $visitorData) {
        if (!empty($visitorData)) {
            $visitor = explode("->", $visitorData);
            if ($visitor[0] == $ip) {
                $visitorExists = true;
                $visitor[1] += 1;
                // 更新访问次数
                $visitor[2] = $browser;
                // 更新访问browser
                $visitor[4] = $visitTime;
                // 更新最后访问时间
                $visitor[5] = $page;
                // 更新访问页面
                $visitorInfo = implode("->", $visitor);
                // 将更新后的访问者信息写入到数据文件中
                $newVisitors = '';
                foreach ($visitorsArray as $visitorData) {
                    if (!empty($visitorData)) {
                        $visitor = explode("->", $visitorData);
                        if ($visitor[0] == $ip) {
                            $visitorData = $visitorInfo;
                        }
                        $newVisitors .= $visitorData . "\n";
                    }
                }
                // 保存访问者信息到数据文件中
                file_put_contents($dataFile, $newVisitors);
                break;
            }
        }
    }
    // 如果当前访问者不存在于数据文件中,则添加访问者信息
    if (!$visitorExists) {
        $visitorInfo = "{$ip}->1->{$browser}->{$visitTime}->{$visitTime}->{$page}";
        $visitors .= $visitorInfo . "\n";
        // 保存访问者信息到数据文件中
        file_put_contents($dataFile, $visitors);
    }
}
// 获取浏览器信息
function get_browser_info()
{
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $browser = 'Unknown';
    $version = '';
    if (stripos($user_agent, 'MSIE') !== false || stripos($user_agent, 'Trident') !== false) {
        $browser = 'Internet Explorer';
        $browser_array = array('MSIE', 'Trident', 'rv');
    } elseif (stripos($user_agent, 'Firefox') !== false) {
        $browser = 'Mozilla Firefox';
        $browser_array = array('Firefox');
    } elseif (stripos($user_agent, 'Chrome') !== false) {
        $browser = 'Google Chrome';
        $browser_array = array('Chrome');
    } elseif (stripos($user_agent, 'Safari') !== false) {
        $browser = 'Apple Safari';
        $browser_array = array('Version', 'Safari');
    } elseif (stripos($user_agent, 'Opera') !== false) {
        $browser = 'Opera';
        $browser_array = array('Opera', 'OPR', 'Version');
    }
    if ($browser != 'Unknown') {
        $browser_ver = '';
        foreach ($browser_array as $key) {
            if (preg_match("/({$key})[\\/ ]?([0-9.]+)/i", $user_agent, $match)) {
                $browser_ver = $match[2];
                break;
            }
        }
        if ($browser_ver != '') {
            $version = $browser_ver;
        }
    }
    return $browser . ' ' . $version;
}
// 获取用户设备信息
function get_user_os()
{
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $os_platform = "Unknown OS Platform";
    $os_array = array('/windows nt 10/i' => 'Windows 10', '/windows nt 6.3/i' => 'Windows 8.1', '/windows nt 6.2/i' => 'Windows 8', '/windows nt 6.1/i' => 'Windows 7', '/windows nt 6.0/i' => 'Windows Vista', '/windows nt 5.2/i' => 'Windows Server 2003/XP x64', '/windows nt 5.1/i' => 'Windows XP', '/windows xp/i' => 'Windows XP', '/windows nt 5.0/i' => 'Windows 2000', '/windows me/i' => 'Windows ME', '/win98/i' => 'Windows 98', '/win95/i' => 'Windows 95', '/win16/i' => 'Windows 3.11', '/macintosh|mac os x/i' => 'Mac OS X', '/mac_powerpc/i' => 'Mac OS 9', '/linux/i' => 'Linux', '/ubuntu/i' => 'Ubuntu', '/iphone/i' => 'iPhone', '/ipod/i' => 'iPod', '/ipad/i' => 'iPad', '/android/i' => 'Android', '/blackberry/i' => 'BlackBerry', '/webos/i' => 'Mobile');
    foreach ($os_array as $regex => $value) {
        if (preg_match($regex, $user_agent)) {
            $os_platform = $value;
        }
    }
    return $os_platform;
}
?>
</body>
</html>
MYSQL存储

引入方法:

新建一个.php文件将下方的代码粘贴进去,引入到你网站的全局文件中,比如<?php $this->need(‘visitors_text.php’); ?>,或者<script type=”text/javascript” src=”visitors.php?type=1″></script>,joe主题可以直接放在全局设置->自定义底部栏中,

本地数据导入:

如果我们一开始数据存储在本地,后续想变更到mysql只需要访问这个文件目录加上 ?type=3 即可,示例:https://域名/visitors_text.php?type=3,即可将本地存储的数据导入进mysql了

查看全部访客数据:

示例:https://域名/visitors_text.php?type=2

查询当前设备数据:

示例:https://域名/visitors_text.php

查询指定设备数据:

示例:https://域名/visitors_text.php?type=2&ip=需要查询的IP

使用提醒

导入后记得将数据库名等参数填写一下,大概在35行,建议新建一个专用访客数据库,以防数据泄露,数据查询一次性仅展示最新的100条数据,您可以根据自己的需要在大概87行的位置进行修改

lfexwbir.png
lfexwbir.png
lfey1mpl.png
lfey1mpl.png
MYSQL数据存储代码如下
代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <title>访客信息查询</title>
    <style>
        table {
            border-collapse: collapse;
            margin: auto;
            font-size: 14px;
            font-family: Arial, sans-serif;
        }
        table td, table th {
            border: 1px solid #ddd;
            padding: 8px;
        }
        table th {
            background-color: #f2f2f2;
        }
        table tr:nth-child(even) {
            background-color: #f9f9f9;
        }
    </style>
</head>
<body>
<?php
// 获取用户IP地址
$ip = $_SERVER['REMOTE_ADDR'];
// 获取用户访问浏览器
$browser = get_user_os() . " - " . get_browser_info();
// 获取用户访问页面
$page = $_SERVER['HTTP_REFERER'];
if ($page == '') {
    $page = $_SERVER['REQUEST_URI'];
}
// 记录访问时间
$visitTime = time();
// 创建数据库连接
$servername = '127.0.0.1';
$username = '';
$password = '';
$dbname = '';
$name = 'visitors';
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    //         echo '{"code":"400","msg":"数据库连接失败"'.$conn->connect_error."}";
    //         echo '{"code":"400","msg":"数据库连接失败"}';
    return;
}
// 创建数据库
$sql = "CREATE TABLE IF NOT EXISTS {$name} (\r\n    id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,\r\n    ip VARCHAR(15) NOT NULL,\r\n    visits INT(11) NOT NULL,\r\n    browser VARCHAR(100) NOT NULL,\r\n    first_visit VARCHAR(50) NOT NULL,\r\n    last_visit VARCHAR(50) NOT NULL,\r\n    page VARCHAR(100) NOT NULL\r\n    )";
if (mysqli_query($conn, $sql)) {
    // echo "表创建成功\n";
} else {
    // echo "表创建失败: " . mysqli_error($conn);
    return;
}
// 判断执行类型
if ($_GET['type'] == 1) {
    // 判断是否存在用户
    $sql = "SELECT * FROM `{$name}` WHERE `ip` LIKE '{$ip}'";
    $result = $conn->query($sql);
    //     新建用户
    if ($result->num_rows <= 0) {
        $sql = "INSERT INTO `{$dbname}`.`{$name}` (`id`, `ip`, `first_visit`, `last_visit`, `visits`, `browser`, `page`) VALUES (NULL, '{$ip}', '{$visitTime}','{$visitTime}','1', '{$browser}', '{$page}')";
        if ($conn->query($sql) === FALSE) {
            //             echo "Error: " . $sql . "<br>" . $conn->error;
            //             echo '{"code":"400","msg":"注册失败,数据写入异常"}';
        } else {
            //             echo '{"code":"200","msg":"注册成功"}';
        }
    } else {
        $row = mysqli_fetch_assoc($result);
        $visits = $row["visits"] + 1;
        // 更新访问次数
        $sql = "UPDATE `{$dbname}`.`{$name}` SET `last_visit` = '{$visitTime}', `visits` = '{$visits}', `browser` = '{$browser}', `page` = '{$page}' WHERE `ip` = '{$ip}'";
        if ($conn->query($sql) === FALSE) {
            //         echo "Error: " . $sql . "<br>" . $conn->error;
            //         echo '{"code":"400","msg":"数据修改失败,写入异常"}';
        } else {
            //         echo '{"code":"200","msg":"数据修改成功"}';
        }
    }
}
// 判断执行类型
if ($_GET['type'] == 2) {
    if ($_GET['ip'] == '') {
        $sql = "SELECT * FROM `{$name}` ORDER BY `last_visit` DESC limit 0,100";
    } else {
        $user = $_GET['type'];
        $sql = "SELECT * FROM `{$name}` WHERE `ip` = '{$user}'";
    }
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        // 输出数据
        echo '<table border="1">';
        echo '<tr><th>IP地址</th><th>访问次数</th><th>浏览器</th><th>首次访问时间</th><th>最后访问时间</th><th>最后访问页面</th></tr>';
        while ($row = $result->fetch_assoc()) {
            echo '<tr>';
            echo '<td>' . $row['ip'] . '</td>';
            echo '<td>' . $row['visits'] . '</td>';
            echo '<td>' . $row['browser'] . '</td>';
            echo '<td>' . date('Y-m-d H:i:s', $row['first_visit']) . '</td>';
            echo '<td>' . date('Y-m-d H:i:s', $row['last_visit']) . '</td>';
            echo '<td>' . $row['page'] . '</td>';
            echo '</tr>';
        }
        echo '</table>';
    } else {
        echo '{"code":"200","msg":"暂时没有任何数据哦~"}';
    }
}
// 判断执行类型
if ($_GET['type'] == 3) {
    // 打开数据文件
    $file = fopen("visitors.txt", "r");
    // 逐行读取数据并插入到数据库
    while (($line = fgets($file)) !== false) {
        $data = explode("->", trim($line));
        // 构造 SQL 语句
        $sql = "INSERT INTO `{$dbname}`.`{$name}` (`id`, `ip`, `first_visit`, `last_visit`, `visits`, `browser`, `page`) VALUES (NULL, '{$data[0]}', '{$data[3]}','{$data[4]}','{$data[1]}', '{$data[2]}', '{$data[5]}')";
        // 执行 SQL 语句
        if ($conn->query($sql) === true) {
            echo "插入成功: {$line}";
        } else {
            echo "插入失败: " . $conn->error;
        }
    }
    // 关闭文件和数据库连接
    fclose($file);
}
// 判断执行类型
if ($_GET['type'] == '') {
    if ($_GET['ip'] == '') {
        $sql = "SELECT * FROM `{$name}` WHERE `ip` = '{$ip}'";
        $result = $conn->query($sql);
        if ($result->num_rows > 0) {
            // 输出数据
            echo '<table border="1">';
            echo '<tr><th>IP地址</th><th>访问次数</th><th>浏览器</th><th>首次访问时间</th><th>最后访问时间</th><th>最后访问页面</th></tr>';
            while ($row = $result->fetch_assoc()) {
                echo '<tr>';
                echo '<td>' . $row['ip'] . '</td>';
                echo '<td>' . $row['visits'] . '</td>';
                echo '<td>' . $row['browser'] . '</td>';
                echo '<td>' . date('Y-m-d H:i:s', $row['first_visit']) . '</td>';
                echo '<td>' . date('Y-m-d H:i:s', $row['last_visit']) . '</td>';
                echo '<td>' . $row['page'] . '</td>';
                echo '</tr>';
            }
            echo '</table>';
        } else {
            echo '{"code":"200","msg":"暂时没有任何数据哦~"}';
        }
    }
}
// 获取浏览器信息
function get_browser_info()
{
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $browser = 'Unknown';
    $version = '';
    if (stripos($user_agent, 'MSIE') !== false || stripos($user_agent, 'Trident') !== false) {
        $browser = 'Internet Explorer';
        $browser_array = array('MSIE', 'Trident', 'rv');
    } elseif (stripos($user_agent, 'Firefox') !== false) {
        $browser = 'Mozilla Firefox';
        $browser_array = array('Firefox');
    } elseif (stripos($user_agent, 'Chrome') !== false) {
        $browser = 'Google Chrome';
        $browser_array = array('Chrome');
    } elseif (stripos($user_agent, 'Safari') !== false) {
        $browser = 'Apple Safari';
        $browser_array = array('Version', 'Safari');
    } elseif (stripos($user_agent, 'Opera') !== false) {
        $browser = 'Opera';
        $browser_array = array('Opera', 'OPR', 'Version');
    }
    if ($browser != 'Unknown') {
        $browser_ver = '';
        foreach ($browser_array as $key) {
            if (preg_match("/({$key})[\\/ ]?([0-9.]+)/i", $user_agent, $match)) {
                $browser_ver = $match[2];
                break;
            }
        }
        if ($browser_ver != '') {
            $version = $browser_ver;
        }
    }
    return $browser . ' ' . $version;
}
// 获取用户设备信息
function get_user_os()
{
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $os_platform = "Unknown OS Platform";
    $os_array = array('/windows nt 10/i' => 'Windows 10', '/windows nt 6.3/i' => 'Windows 8.1', '/windows nt 6.2/i' => 'Windows 8', '/windows nt 6.1/i' => 'Windows 7', '/windows nt 6.0/i' => 'Windows Vista', '/windows nt 5.2/i' => 'Windows Server 2003/XP x64', '/windows nt 5.1/i' => 'Windows XP', '/windows xp/i' => 'Windows XP', '/windows nt 5.0/i' => 'Windows 2000', '/windows me/i' => 'Windows ME', '/win98/i' => 'Windows 98', '/win95/i' => 'Windows 95', '/win16/i' => 'Windows 3.11', '/macintosh|mac os x/i' => 'Mac OS X', '/mac_powerpc/i' => 'Mac OS 9', '/linux/i' => 'Linux', '/ubuntu/i' => 'Ubuntu', '/iphone/i' => 'iPhone', '/ipod/i' => 'iPod', '/ipad/i' => 'iPad', '/android/i' => 'Android', '/blackberry/i' => 'BlackBerry', '/webos/i' => 'Mobile');
    foreach ($os_array as $regex => $value) {
        if (preg_match($regex, $user_agent)) {
            $os_platform = $value;
        }
    }
    return $os_platform;
}
?>
</body>
</html>
使用小技巧

我们可以通过判断所有访客的访问次数计算出网站的累计访客,可以通过计算所有页面出现的次数判断最受欢迎的页面,通过判断首次访问时间计算出今日的网站新增访客,通过最后访问时间计算出今日的访客数量或者今日点击次数等,当然这种统计相对来说是不精准的,如果您需要更加精准的统计还是建议接入一些专业的网站统计

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用前言
  • 本地存储
  • 本地存储代码如下
  • MYSQL存储
  • MYSQL数据存储代码如下
  • 使用小技巧
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档