php网站访问统计是了解用户访问情况、优化网站体验的重要功能,通过记录访问数据并分析,可以掌握用户来源、访问偏好等核心信息。下面我们就一步步实现完整的访问统计配置。

一、环境准备与数据库设计
首先需要准备php运行环境和MySQL数据库,我们需要创建一张表来存储访问相关的数据,表结构如下:
CREATE TABLE `visit_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(50) DEFAULT NULL COMMENT '访问者IP', `visit_time` datetime DEFAULT NULL COMMENT '访问时间', `referer` varchar(500) DEFAULT NULL COMMENT '访问来源页面', `user_agent` varchar(500) DEFAULT NULL COMMENT '用户浏览器信息', `page_url` varchar(500) DEFAULT NULL COMMENT '访问的页面地址', `stay_time` int(11) DEFAULT 0 COMMENT '停留时长,单位秒', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
二、基础访问数据采集实现
我们可以在网站的公共入口文件或者每个页面的头部引入统计代码,自动采集用户的访问信息并存入数据库。下面是核心的采集代码:
<?php
// 数据库连接配置
$db_host = '127.0.0.1';
$db_user = 'root';
$db_pass = '123456';
$db_name = 'test_db';
// 建立数据库连接
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
die("数据库连接失败: " . $conn->connect_error);
}
// 采集访问数据
$ip = $_SERVER['REMOTE_ADDR']; // 获取访问者IP
$visit_time = date('Y-m-d H:i:s'); // 当前访问时间
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '直接访问'; // 访问来源
$user_agent = $_SERVER['HTTP_USER_AGENT']; // 浏览器信息
$page_url = $_SERVER['REQUEST_URI']; // 当前访问页面地址
// 插入访问记录到数据库
$sql = "INSERT INTO visit_log (ip, visit_time, referer, user_agent, page_url, stay_time)
VALUES ('$ip', '$visit_time', '$referer', '$user_agent', '$page_url', 0)";
if ($conn->query($sql) === TRUE) {
$visit_id = $conn->insert_id; // 获取本次访问记录的ID,用于后续计算停留时长
// 将访问ID存入session,用户离开页面时更新停留时长
session_start();
$_SESSION['visit_id'] = $visit_id;
} else {
// 统计失败不影响页面正常展示,仅记录错误日志
error_log("访问统计插入失败: " . $conn->error);
}
$conn->close();
?>三、用户停留时长统计
要统计用户在页面的停留时长,可以在页面底部添加退出时的上报逻辑,通过js在用户离开页面时发送请求更新停留时间:
<?php
// 假设这个文件是update_stay_time.php,用于接收停留时长更新请求
session_start();
if (isset($_SESSION['visit_id']) && isset($_POST['stay_time'])) {
$visit_id = $_SESSION['visit_id'];
$stay_time = intval($_POST['stay_time']);
$db_host = '127.0.0.1';
$db_user = 'root';
$db_pass = '123456';
$db_name = 'test_db';
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
$sql = "UPDATE visit_log SET stay_time = $stay_time WHERE id = $visit_id";
$conn->query($sql);
$conn->close();
}
?>对应的前端js代码如下,放在页面底部:
<script>
// 记录页面进入时间
var enterTime = new Date().getTime();
// 页面卸载时计算停留时长并上报
window.addEventListener('beforeunload', function() {
var leaveTime = new Date().getTime();
var stayTime = Math.round((leaveTime - enterTime) / 1000); // 转换为秒
// 发送异步请求更新停留时长
var xhr = new XMLHttpRequest();
xhr.open('POST', '/update_stay_time.php', false); // 同步请求确保数据发送完成
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('stay_time=' + stayTime);
});
</script>四、访问来源与用户行为分析实现
采集到数据后,我们可以通过sql查询实现访问来源和用户行为的分析,以下是常见的分析场景代码示例:
1. 统计不同访问来源的访问量
<?php
$conn = new mysqli('127.0.0.1', 'root', '123456', 'test_db');
// 统计来源为搜索引擎、外部链接、直接访问的数量
$sql = "SELECT
CASE
WHEN referer LIKE '%baidu.com%' OR referer LIKE '%google.com%' THEN '搜索引擎'
WHEN referer != '直接访问' THEN '外部链接'
ELSE '直接访问'
END as source_type,
COUNT(*) as visit_count
FROM visit_log
GROUP BY source_type";
$result = $conn->query($sql);
while ($row = $result->fetch_assoc()) {
echo "来源类型: " . $row['source_type'] . ",访问量: " . $row['visit_count'] . "<br>";
}
$conn->close();
?>2. 统计热门访问页面
<?php
$conn = new mysqli('127.0.0.1', 'root', '123456', 'test_db');
$sql = "SELECT page_url, COUNT(*) as visit_count, AVG(stay_time) as avg_stay
FROM visit_log
GROUP BY page_url
ORDER BY visit_count DESC
LIMIT 10";
$result = $conn->query($sql);
echo "<table border='1'>
<tr><th>页面地址</th><th>访问量</th><th>平均停留时长(秒)</th></tr>";
while ($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row['page_url'] . "</td><td>" . $row['visit_count'] . "</td><td>" . $row['avg_stay'] . "</td></tr>";
}
echo "</table>";
$conn->close();
?>3. 统计用户的时段访问分布
<?php
$conn = new mysqli('127.0.0.1', 'root', '123456', 'test_db');
$sql = "SELECT HOUR(visit_time) as visit_hour, COUNT(*) as visit_count
FROM visit_log
GROUP BY visit_hour
ORDER BY visit_hour";
$result = $conn->query($sql);
echo "各时段访问量分布:<br>";
while ($row = $result->fetch_assoc()) {
echo $row['visit_hour'] . "时: " . $row['visit_count'] . "次<br>";
}
$conn->close();
?>五、注意事项
- 采集IP时如果需要获取真实IP,需要额外处理反向代理场景下的
HTTP_X_FORWARDED_FOR头部信息 - 访问数据量较大时,可以定期将历史数据归档到其他表,避免主表数据过大影响查询性能
- 用户停留时长的统计存在一定误差,仅作为参考使用,不适合作为精准数据分析的唯一依据
- 如果用户禁用了js,停留时长的统计会失效,可以根据实际需求选择是否保留该功能
按照以上步骤配置完成后,就可以实现php网站的基础访问统计、访问来源分析与用户行为统计功能,后续也可以根据业务需求扩展更多的统计维度。