不依賴資料庫,純 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> // 頁面將直接輸出當前在線人數數字
document.write)session_id() 替代自定義 Cookie,整合 PHP 原生 Session 機制apcu 或 opcache 快取計數器,定期落盤online_{$page}.txtvisit_log.txt 記錄每日唯一訪客