自己写个简单的访客统计

使用前言

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

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

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

图片[1]-自己写个简单的访客统计-小纸条

这里我写了两种存储方式,一种是本地存储,一种是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

本地存储代码如下
<!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
lfey1mpl.png

MYSQL数据存储代码如下
<!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>
使用小技巧

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

THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

夸夸
夸夸
还有吗!没看够!
取消
昵称表情代码图片

    暂无评论内容