PHP实现唯一用户文章浏览统计方法
本文介绍一种结合Cookie与Session的可靠方案,确保每篇文章对同一用户仅统计一次浏览量,避免页面刷新导致重复计数,兼顾安全性与实用性。

本文介绍一种结合 Cookie 与 Session 的可靠方案,确保每篇文章对同一用户仅统计一次浏览量,避免页面刷新导致重复计数,兼顾安全性与实用性。
本文介绍一种结合 Cookie 与 Session 的可靠方案,确保每篇文章对同一用户仅统计一次浏览量,避免页面刷新导致重复计数,兼顾安全性与实用性。
在构建内容型网站(如音乐作品页、博客文章页)时,准确的“独立用户浏览量”(Unique View Count)比单纯刷新计数更有业务价值。原始代码仅依赖 $_SESSION['recent_posts'][$id],但 Session 在页面重载时仍可能未及时生效或跨请求丢失逻辑边界,导致重复更新;而纯 Cookie 方案又易被清除或伪造。因此,推荐采用 Cookie 主控 + Session 辅助的双层校验策略,既保障用户维度唯一性,又提升服务端可控性。
✅ 推荐实现方案(安全增强版)
prepare($sql);
$stmt->execute([$id]);
// 5. 设置长期 Cookie(30 天),作用域为根路径,确保跨子目录有效
setcookie($cookieKey, '1', [
'expires' => time() + (86400 * 30),
'path' => '/',
'domain' => '', // 可选:指定域名增强安全性
'secure' => isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on',
'httponly'=> true,
'samesite'=> 'Lax'
]);
// 6. 同步标记到 Session(可选,用于同会话内快速判断)
if (!isset($_SESSION['recent_posts'])) {
$_SESSION['recent_posts'] = [];
}
$_SESSION['recent_posts'][$id] = true;
}
?>⚠️ 关键注意事项
- 永远不要直接拼接 $_GET 参数到 SQL 中:原代码 $id = $_GET['id'] 存在严重 SQL 注入风险,必须强制类型转换(如 (int))或使用预处理语句(如本例所示)。
- Cookie 命名需唯一化:使用 viewed_post_{$id} 而非固定名(如 view_counted),防止多篇文章互相覆盖判断逻辑。
- Session 仅为辅助缓存:它不具备持久性,不能替代 Cookie 做长期唯一性判定;Cookie 才是跨会话识别用户的核心依据。
- 考虑隐私合规:若目标用户位于欧盟等地区,需在设置 Cookie 前获得用户明确同意(GDPR 要求)。
- 高并发场景优化:对于海量访问,可将计数暂存 Redis,定时批量写入数据库,避免频繁 UPDATE 锁表。
✅ 效果验证方式
- 访问 song.php?id=5 → 数据库 count +1;
- 刷新页面 → count 不再增加(Cookie 已存在);
- 清除浏览器 Cookie 后重访 → count 再次 +1;
- 切换文章 song.php?id=6 → 独立触发新 Cookie 和计数。
通过该方案,你将获得真正反映“独立用户触达”的浏览数据,为内容运营提供可信依据。
火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。
Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,
火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。















