使用前言
最近想给自己网站加个访客统计,发现好多网站统计都需要付费…,这对于我们这种非营利性的网站来说无疑是不划算的,于是就自己写了个简单的网站访客统计效果如下
原创文章,转载请注明出处
效果演示:https://blog.uurr.cn/info/visitors_text.php?type=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行的位置进行修改
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>
使用小技巧
我们可以通过判断所有访客的访问次数计算出网站的累计访客,可以通过计算所有页面出现的次数判断最受欢迎的页面,通过判断首次访问时间计算出今日的网站新增访客,通过最后访问时间计算出今日的访客数量或者今日点击次数等,当然这种统计相对来说是不精准的,如果您需要更加精准的统计还是建议接入一些专业的网站统计
暂无评论内容