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

PHP 實現網站在線人數統計:文件存儲版完整代碼

     編輯:PHP 相關知識

PHP 實現網站在線人數統計:文件存儲版完整代碼

無需資料庫,利用文件記錄每個訪客 IP 與最後活躍時間戳,定期清理超時記錄 (默認 15 分鐘),即時返回在線人數。適合中小流量站點、靜態頁嵌入。

核心實現

function countOnline(int $timeout = 900): int {
    $file = __DIR__ . '/online_count.txt';
    $now = time();
    $ip = $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? 'unknown';

    // 讀取現有記錄
    $records = [];
    if (file_exists($file)) {
        $lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        foreach ($lines as $line) {
            [$ts, $recordIp] = explode("\t", $line, 2);
            if ($now - (int)$ts < $timeout) {
                $records[$recordIp] = (int)$ts;
            }
        }
    }

    // 更新當前 IP 時間戳
    $records[$ip] = $now;

    // 寫回文件 (獨佔鎖防併發損壞)
    $fp = fopen($file, 'c+');
    flock($fp, LOCK_EX);
    ftruncate($fp, 0);
    foreach ($records as $rip => $ts) {
        fwrite($fp, "$ts\t$rip\n");
    }
    flock($fp, LOCK_UN);
    fclose($fp);

    return count($records);
}

// 使用
echo "當前在線: " . countOnline() . " 人";

關鍵點解析

  • IP 獲取:兼容代理頭 HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR
  • 超時清理:讀取時過濾 $now - $ts >= $timeout 的記錄
  • 併發安全:fopen('c+') + flock(LOCK_EX) + ftruncate 確保原子寫入
  • 儲存格式:每行 timestamp\tIP,便於解析與人工檢查

前端 AJAX 輪詢顯示

// online.php


// 前端 JS
setInterval(() => {
    fetch('online.php').then(r => r.text()).then(n => {
        document.getElementById('online-count').textContent = n;
    });
}, 30000);

擴展建議

  • 高併發場景改用 Redis SET nx ex + SCARD 或 Sorted Set (ZSET) 存儲 timestamp 作為 score
  • 區分「遊客」與「登錄用戶」:登錄用戶用 user_id 代替 IP
  • 統計歷史峰值:每日定時任務讀取文件記錄最大值入庫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved