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

PHP 聊天室異常離線處理:目錄式在線追蹤法

     編輯:PHP 相關知識

問題背景

使用者因斷網、當機等非正常方式離開,導致在線名單殘留「僵屍帳號」,顯示人數不準。傳統單一檔案鎖定法在高併發下效能差、易死鎖。

目錄式追蹤架構

  1. 建立 useronline/ 子目錄專存在線資料
  2. 每位使用者進入時,在目錄下建立「以使用者名稱命名的空檔案」
  3. 客戶端定時(每 1~2 分鐘)透過 AJAX 或隱藏框架 touch 更新該檔案修改時間
  4. 後台掃描腳本定期(如每 5 分鐘)掃描目錄,刪除超過閾值(如 5 分鐘)未更新的檔案
  5. 在線人數 = 目錄檔案數;在線名單 = 檔案名稱列表

核心優勢

  • 零鎖定衝突: 各用戶操作獨立檔案,無檔案共享競爭
  • 極低資源消耗: 掃描間隔可設長(5 分鐘),stat() 系統呼叫極快
  • 天然支援分散式: 掛載共享儲存(NFS、GlusterFS)即可跨伺服器叢集
  • 實作簡單: 僅需 touch()、unlink()、scandir()、filemtime() 基礎函式

關鍵代碼片段

// 使用者心跳更新
$user_file = "useronline/$username";
touch($user_file); // 建立或更新修改時間

// 後台清理腳本(cron 每 5 分鐘執行)
$dir = 'useronline/';
$now = time();
$timeout = 300; // 5 分鐘
if ($handle = opendir($dir)) {
    while (false !== ($file = readdir($handle))) {
        if ($file === '.' || $file === '..') continue;
        $path = $dir . $file;
        if ($now - filemtime($path) > $timeout) {
            unlink($path); // 判定為異常離線,移除
        }
    }
    closedir($handle);
}
$online_users = array_diff(scandir($dir), ['.', '..']);
$online_count = count($online_users);

適用場景與限制

適合中小型聊天室、即時客服系統、線上遊戲大廳。極大規模(十萬級併發)建議改用 Redis Set + TTL 或 GatewayWorker 等長連接框架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved