使用纯文本文件存储(最简单、无需数据库)
这种方法非常适合小型网站或个人博客,它不需要数据库,只需要一个文本文件来存储访问次数。

(图片来源网络,侵删)
原理:
- 创建一个文本文件(
counter.txt)来存储访问次数。 - 每当有用户访问页面时,PHP 脚本会读取这个文件中的数字。
- 将数字加 1。
- 将新数字写回文件中。
代码实现:
-
创建一个计数器文件: 在您的网站根目录下创建一个名为
counter.txt的文件,并在里面输入一个初始数字,0。counter.txt --- 0 -
创建 PHP 访问统计页面(
index.php):
(图片来源网络,侵删)<?php // 定义计数器文件的路径 $file = 'counter.txt'; // 检查文件是否存在并可读 if (file_exists($file) && is_readable($file)) { // 读取当前访问次数 $current_count = (int)file_get_contents($file); // 访问次数加 1 $new_count = $current_count + 1; // 将新的访问次数写回文件 // 使用 LOCK_EX 锁定文件,防止在写入过程中其他请求同时修改 file_put_contents($file, $new_count, LOCK_EX); // 显示访问次数 echo "您是第 <strong>" . htmlspecialchars($new_count) . "</strong> 位访客"; } else { // 如果文件不存在或无法读取,显示错误信息 echo "无法统计访问次数,请检查 counter.txt 文件是否存在且可写。"; } ?>
优缺点:
- 优点: 极其简单,无需数据库。
- 缺点:
- 不精确: 在高并发访问下,多个请求可能同时读取文件,导致统计结果不准确(这个问题可以通过
LOCK_EX部分缓解,但不能完全根除)。 - 安全性:
counter.txt的权限设置不当,可能会被恶意篡改。 - 性能: 每次访问都需要进行文件读写操作,对于高流量网站可能成为性能瓶颈。
- 不精确: 在高并发访问下,多个请求可能同时读取文件,导致统计结果不准确(这个问题可以通过
使用 MySQL 数据库(最常用、最可靠)
这是专业网站最常用的方法,它更可靠、更安全,并且可以轻松扩展,比如按日期、按页面等维度进行统计。
原理:
- 在 MySQL 数据库中创建一个表来存储访问数据。
- 当用户访问页面时,PHP 连接数据库,查询该页面的访问次数。
- 将访问次数加 1,并更新回数据库。
代码实现:

(图片来源网络,侵删)
-
创建数据库和表: 您需要有一个 MySQL 数据库,然后执行以下 SQL 语句来创建一个统计表。
CREATE TABLE `page_views` ( `id` int(11) NOT NULL AUTO_INCREMENT, `page_url` varchar(255) NOT NULL COMMENT '页面URL', `view_count` int(11) NOT NULL DEFAULT '0' COMMENT '访问次数', `last_viewed` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '最后访问时间', PRIMARY KEY (`id`), UNIQUE KEY `url_unique` (`page_url`) -- 确保每个URL只记录一次 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
创建 PHP 统计代码(
db_counter.php): 这是一个可复用的代码片段,您可以在任何需要统计的页面顶部引入它。<?php // --- 数据库配置 --- $db_host = 'localhost'; // 数据库主机 $db_user = 'root'; // 数据库用户名 $db_pass = ''; // 数据库密码 $db_name = 'your_database'; // 数据库名 // 获取当前页面的URL,作为统计的唯一标识 // 使用 basename 只统计页面本身,不统计URL参数 $page_url = basename($_SERVER['PHP_SELF']); // 创建数据库连接 $conn = new mysqli($db_host, $db_user, $db_pass, $db_name); // 检查连接是否成功 if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } // 设置字符集 $conn->set_charset("utf8mb4"); // 使用预处理语句来防止SQL注入,这是非常重要的安全措施! // 1. 检查该页面是否已在表中存在 $check_sql = "SELECT view_count FROM page_views WHERE page_url = ?"; $stmt = $conn->prepare($check_sql); $stmt->bind_param("s", $page_url); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { // 如果页面已存在,则更新访问次数 $row = $result->fetch_assoc(); $new_count = $row['view_count'] + 1; $update_sql = "UPDATE page_views SET view_count = ?, last_viewed = CURRENT_TIMESTAMP() WHERE page_url = ?"; $update_stmt = $conn->prepare($update_sql); $update_stmt->bind_param("is", $new_count, $page_url); $update_stmt->execute(); } else { // 如果页面不存在,则插入一条新记录 $initial_count = 1; $insert_sql = "INSERT INTO page_views (page_url, view_count) VALUES (?, ?)"; $insert_stmt = $conn->prepare($insert_sql); $insert_stmt->bind_param("si", $page_url, $initial_count); $insert_stmt->execute(); } // 关闭连接 $stmt->close(); $update_stmt->close(); $insert_stmt->close(); $conn->close(); // --- 在这里您可以显示访问次数 --- // 您可以在页面的某个位置显示 "本页已被访问 X 次" // 您需要再次查询数据库来获取当前页面的访问次数以显示 // 为了方便,您可以将上面的查询逻辑封装成一个函数 ?> -
如何在页面中使用并显示访问次数: 在您的
index.php或其他页面中,引入上面的db_counter.php,然后执行一次查询来获取并显示访问次数。<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>我的首页</title> </head> <body> <h1>欢迎来到我的网站</h1> <?php // 1. 引入计数器逻辑(这会更新数据库中的计数) require_once 'db_counter.php'; // 2. 连接数据库并查询当前页面的访问次数以显示 // (注意:为了避免重复连接,可以将查询逻辑也放到 db_counter.php 中并返回结果) $conn = new mysqli($db_host, $db_user, $db_pass, $db_name); $conn->set_charset("utf8mb4"); $page_url = basename($_SERVER['PHP_SELF']); $display_sql = "SELECT view_count FROM page_views WHERE page_url = ?"; $stmt = $conn->prepare($display_sql); $stmt->bind_param("s", $page_url); $stmt->execute(); $display_result = $stmt->get_result(); $row = $display_result->fetch_assoc(); $view_count = $row['view_count']; $stmt->close(); $conn->close(); ?> <p>本页已被访问 <strong><?php echo $view_count; ?></strong> 次。</p> </body> </html>
优缺点:
- 优点:
- 精确可靠: 数据库事务可以确保并发访问时数据的一致性。
- 安全: 使用预处理语句有效防止 SQL 注入。
- 功能强大: 可以轻松进行复杂查询,如统计总访问量、按日期统计、按页面统计等。
- 缺点:
- 需要数据库: 需要配置和维护 MySQL 数据库。
使用 PHP Session(统计独立访客)
如果您想统计的是“独立访客”(UV - Unique Visitor)而不是“页面访问量”(PV - Page View),可以使用 Session。
原理:
- 当用户第一次访问网站时,PHP 会创建一个 Session。
- 在 Session 中设置一个标志(
$_SESSION['visited'] = true)。 - 在页面中,检查这个标志是否存在,如果不存在,说明是新访客,则增加访客计数器,然后设置标志。
代码实现:
<?php
// 启动 Session
session_start();
// 定义计数器文件
$counter_file = 'unique_visitors.txt';
// 检查 Session 中是否有访问标记
if (!isset($_SESSION['visited'])) {
// 如果没有,说明是新访客
if (file_exists($counter_file) && is_readable($counter_file)) {
$current_count = (int)file_get_contents($counter_file);
$new_count = $current_count + 1;
file_put_contents($counter_file, $new_count, LOCK_EX);
} else {
// 如果文件不存在,则创建并写入 1
file_put_contents($counter_file, 1, LOCK_EX);
}
// 设置 Session 标记,防止同一会话内重复计数
$_SESSION['visited'] = true;
}
// 读取并显示独立访客总数
if (file_exists($counter_file)) {
$total_visitors = file_get_contents($counter_file);
echo "独立访客总数: <strong>" . htmlspecialchars($total_visitors) . "</strong>";
} else {
echo "无法读取访客数据。";
}
?>
注意:
- 这种方法统计的是“浏览器会话”级别的独立访客,如果用户关闭浏览器再打开,Session 会被销毁,他/她会被算作一个新的访客。
- 对于更精确的独立访客统计(例如基于 IP 地址或登录用户),仍然推荐使用数据库。
总结与建议
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 文本文件 | 个人博客、小型项目、快速实现 | 简单、无需数据库 | 不精确、不安全、性能差 |
| MySQL 数据库 | 绝大多数网站、专业项目 | 精确、可靠、安全、功能强大 | 需要配置和维护数据库 |
| PHP Session | 统计当前会话的独立访客 | 实现简单,避免重复计数 | 不算真正的独立访客,依赖浏览器 |
给您的建议:
- 如果您是初学者或做一个简单的个人网站,可以从方法一(文本文件)开始,了解基本原理。
- 对于任何正式的、有流量预期的网站,强烈推荐使用方法二(MySQL 数据库),它是最专业、最可靠的解决方案。
- 如果您需要区分独立访客和页面访问量,可以将方法二和方法三结合使用,分别创建
page_views(PV)和unique_visitors(UV)两张表。
