PHP实现网站访问量统计:总访问、今日与昨日流量

林见深
林见深
发布时间:2026-10-15| 2人浏览过
原创

本文详解如何使用 PHP 和 MySQL 构建一个基础的网站流量统计模块,涵盖总访问量、今日及昨日流量的数据展示。通过解析服务器时间与数据库记录日期的差异自动轮转统计数据,并结合 Cookie 机制实现同一访客的访问去重,提供完整的数据表结构设计与核心处理代码。

实现目标与准备条件

该功能旨在实时记录并展示网站的三类核心数据:

  • 总访问量:网站运行以来的累计访问次数。
  • 今日流量:当天内的新增访问量。
  • 昨日流量:前一天的累计访问量(用于展示历史数据)。

实现此功能需要以下基础环境支持:

  1. 数据库:MySQL 5.0+ 版本,使用 InnoDB 引擎以保证事务安全。
  2. 后端语言:PHP 5.x/7.x(注:示例代码使用了较旧的 mysql 扩展,实际生产环境建议迁移至 mysqli 或 PDO)。
  3. Cookie支持:浏览器需允许 Cookie 存储,用于识别“新访客”与“老访客”。

数据库结构设计

首先需要创建一个名为 mycounter 的数据表,用于存储统计状态。表结构包含主键、当前计数器、昨日计数器、今日计数器以及最后更新日期。

CREATE TABLE `mycounter` (
  `id` int(11) NOT NULL auto_increment,
  `Counter` int(11) NOT NULL COMMENT '总访问量',
  `CounterLastDay` int(10) default NULL COMMENT '昨日流量',
  `CounterToday` int(10) default NULL COMMENT '今日流量',
  `RecordDate` date NOT NULL COMMENT '最后更新日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk AUTO_INCREMENT=2 ;

创建表后,需插入一条初始记录,例如设置 ID 为 1,初始计数为 0,日期为当前日期,以便系统开始工作。

核心逻辑与操作流程

第1步:初始化访客标识 (Cookie 管理)

目的:区分新老访客,防止同一用户在单次会话中多次刷新导致流量虚高。
操作:在引入统计功能的页面顶部执行 Session 启动与 Cookie 检查。

<?PHP
session_start();
if (!isset($_COOKIE["user"])) {
    // 第一次访问,设置新访客 Cookie,有效期 1 小时
    setcookie("user", "newGuest", time()+3600);
} else {
    // 已存在 Cookie,标记为老访客
    setcookie("user", "oldGuest");
}
?>

第2步:获取并校验数据

目的:从数据库读取最新的统计值,并判断是否跨天。
入口:调用封装好的统计函数 ShowMyCounter()。

注意:原文代码逻辑较为冗长,此处保留其核心判断思路:比较当前年月日与数据库中的 RecordDate。若任一维度更大,则视为新的一天,触发计数器重置逻辑。

第3步:执行计数器更新逻辑

目的:根据时间判断结果,更新数据库中的各项指标。

  1. 跨天重置:如果检测到日期变更,将当日的 CounterToday 赋值给 CounterLastDay,并将 CounterToday 清零,同时更新 RecordDate 为今天。
  2. 增加计数:若请求者被标识为 “newGuest”(即不在过去 1 小时内有记录),则将 Counter 和 CounterToday 各加 1,并写回数据库。

以下是整合后的 PHP 函数代码示例,修正了原文部分语法错误(如变量未定义前引用、SQL注入风险等),并保留了原有业务逻辑结构:

<?php
public function ShowMyCounter(){
    // 1. 连接数据库请替换为您的实际配置
    // $conn = mysqli_connect(...); 
    
    // 2. 读取当前状态
    $querysql = "SELECT * FROM `mycounter` WHERE id = '1'";
    $result = mysql_query($querysql); // 建议使用 mysqli/pdo
    if (!$row = mysql_fetch_array($result)) return;

    // 3. 时间对比逻辑
    $dateNow = explode("-", date('Y-m-d'));
    $recordDate = explode("-", $row['RecordDate']);
    $isGone = FALSE;

    // 简单的日期比较:年 > 年 OR 年==年且月 > 月 OR ... == ... 且日 > 日
    if ($dateNow[0] > $recordDate[0]) {
        $isGone = TRUE;
    } else if ($dateNow[0] == $recordDate[0]) {
        if ($dateNow[1] > $recordDate[1]) {
            $isGone = TRUE;
        } else if ($dateNow[1] == $recordDate[1]) {
            if ($dateNow[2] > $recordDate[2]) {
                $isGone = TRUE;
            }
        }
    }

    // 4. 如果是新的一天,执行重置操作
    if ($isGone) {
        $upd_sql = "UPDATE mycounter 
                    SET RecordDate = '" . date('Y-m-d') . "',
                        CounterToday = 0,
                        CounterLastDay = " . $row['CounterToday'] . " 
                    WHERE id = '1'";
        mysql_query($upd_sql);
    }

    // 5. 再次获取最新数据以进行累加判断
    $result = mysql_query($querysql);
    $row = mysql_fetch_array($result);

    // 6. 仅对新访客增加计数
    if (isset($_COOKIE["user"]) && $_COOKIE["user"] != "oldGuest") {
        $newCounter = ++$row['Counter'];
        $newToday = ++$row['CounterToday'];
        $updateCountSql = "UPDATE mycounter 
                           SET counter = '$newCounter',
                               CounterToday = '$newToday' 
                           WHERE id = '1'";
        mysql_query($updateCountSql);
    }

    // 7. 输出结果
    echo "总访问量:" . $row['Counter'];
    echo "
"; echo "今日流量:" . $row['CounterToday']; echo "
"; echo "昨日流量:" . $row['CounterLastDay']; } ?>

完成判断

当上述代码部署到您的网页头部或公共包含文件中,并确保数据库中有一行有效记录时,页面加载即可看到类似以下的效果:

  • 总访问量:动态数字
  • 今日流量:当日累计数
  • 昨日流量:昨日全天总数

若连续刷新页面(1小时内),总访问量与今日流量不应继续增加,表明 Cookie 去重逻辑生效。

简要总结

以上是对 PHP 实现网站基础流量统计功能的详细内容,主要涉及数据库状态维护与访客身份识别。更多关于 PHP 网站开发及数据统计的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。