頁面訪問計數器需解決兩個核心問題:**去重**(同一用戶短時間重複刷新不計數)與 **顯示**(數字轉圖片防采集)。本文提供一個基於 Session + MySQL 的輕量實現。
<?php
require_once 'config.php'; // 包含 $pdo 或 mysql 連接
function showCounter(): void {
session_start();
// 1. 讀取當前計數
$stmt = $pdo->query('SELECT counter FROM counter LIMIT 1');
$row = $stmt->fetch();
$counter = (int)$row['counter'];
// 2. Session 去重:同一會話只計數一次
if (empty($_SESSION['counted'])) {
$counter++;
$pdo->prepare('UPDATE counter SET counter = ?')->execute([$counter]);
$_SESSION['counted'] = true;
}
// 3. 數字轉圖片輸出(需準備 0-9.gif 放在 image/ 目錄)
$digits = str_split((string)$counter);
foreach ($digits as $d) {
echo '<img src="image/' . $d . '.gif" alt="' . $d . '">';
}
}
// 使用:在頁面模板中直接
CREATE TABLE `counter` (
`counter` BIGINT UNSIGNED NOT NULL DEFAULT 0
) ENGINE=InnoDB;
INSERT INTO `counter` VALUES (0);
| 痛點 | 解決方案 |
|---|---|
| 高併發 UPDATE 鎖爭用 | 改用 Redis INCR 原子自增,定時持久化到 MySQL |
| Session 依賴 Cookie,用戶禁用 Cookie 失效 | 結合 IP + UA 指紋、或 JWT 無狀態標識 |
| 圖片請求數 = 位數,增加 HTTP 開銷 | CSS Sprite 合併單圖、或 Canvas/Font 數字渲染 |
| 機器人惡意刷數 | 接入驗證碼、速率限制、行為分析 |
| 多服務器部署計數不一致 | 集中式存儲,或一致性哈希分片 |
對於商業項目,建議直接接入 **Google Analytics**、**百度統計**、**Matomo (Piwik)** 或 **Umami**,獲得 PV/UV/來源/地域/設備等完整分析維度,免去自建維護成本。
簡單計數器適合個人博客、內部工具、學習練習;生產系統請用專業統計平台。