首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 精確統計在線人數:基於檔案儲存與 Session ID 追蹤

     編輯:PHP 綜合知識

不依賴資料庫,純 PHP 檔案儲存實現高精度在線人數統計。核心機制:以 Session ID 唯一標識訪客,記錄最後通信時間,定期清理過期記錄,檔案鎖確保併發安全。

核心代碼

<?php
$filename = 'online.txt';
$cookieName = 'VGOTCN_OnLineCount';
$onlineTime = 600; // 10 分鐘有效期

$now = $_SERVER['REQUEST_TIME'];
$online = @file($filename) ?: [];
$nowOnline = [];

// 解析現有記錄,保留有效項
foreach ($online as $line) {
    [$sid, $stime] = explode('|', trim($line));
    if (($now - $stime) <= $onlineTime) {
        $nowOnline[$sid] = $stime;
    }
}

// 獲取或分配 Session ID
if (isset($_COOKIE[$cookieName])) {
    $uid = $_COOKIE[$cookieName];
} else {
    $vid = 0;
    do { $uid = 'U' . ++$vid; } while (isset($nowOnline[$uid]));
    setcookie($cookieName, $uid);
}

// 更新當前訪客時間戳
$nowOnline[$uid] = $now;

// 統計在線人數
$total = count($nowOnline);

// 原子寫入(獨佔鎖 + 重寫)
if ($fp = @fopen($filename, 'w')) {
    if (flock($fp, LOCK_EX)) {
        rewind($fp);
        foreach ($nowOnline as $sid => $stime) {
            fwrite($fp, "$sid|$stime\n");
        }
        flock($fp, LOCK_UN);
    }
    fclose($fp);
}

// 輸出 JS 供前端 document.write 引用
echo 'document.write("' . $total . '");';

關鍵設計解析

機制說明
Session ID 識別Cookie 存儲隨機生成的 U{數字},關閉瀏覽器失效,持久訪客自動續期
時間窗清理讀取時過濾 $now - $stime > 600 的記錄,避免檔案無限增長
檔案獨佔鎖flock(LOCK_EX) 防止併發寫入導致資料損壞
原子重寫每次完整重寫檔案,簡單可靠,適合中小流量

前端引用方式

<script src="online.php"></script>
// 頁面將直接輸出當前在線人數數字

適用場景與局限

  • ✅ 輕量級站點、無資料庫環境、單機部署
  • ✅ 靜態頁面嵌入(輸出 JS 供 document.write)
  • ❌ 多伺服器叢集(檔案無法共享,需改 Redis/Memcached)
  • ❌ 極高併發(檔案鎖爭用嚴重,建議改共享記憶體計數器)

進階優化方向

  1. 改用 session_id() 替代自定義 Cookie,整合 PHP 原生 Session 機制
  2. 引入 apcu 或 opcache 快取計數器,定期落盤
  3. 支援多頁面獨立統計:檔案名加入頁面標識 online_{$page}.txt
  4. 增加 UV/PV 統計:另建 visit_log.txt 記錄每日唯一訪客
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved