簡體   English   中英

我可以統計會話以確定在線人數嗎?

[英]Can I count sessions to determine number of people online?

我很困惑。 當我嘗試搜索如何計算PHP中的在線用戶時,所有與MySQL相關的答案和許多不同的方式。

在我的腳本中,任何提交登錄表單的用戶都會創建$ _SESSION ['$ nickname']

所以我想,我可以用count來計算登錄會話($ _ SESSION ['$ nickname']); 並在我的頁面中顯示它?

或者這完全是錯誤的邏輯?

首先,您必須定義“在線”的含義。 用戶是否應該在最近5分鍾內點擊鏈接?

我假設您的數據庫中已有一個用戶表。 所以最簡單的方法是添加一個新列,例如lastAction TIMESTAMP

當用戶點擊頁面上的鏈接時,您的腳本應該更新此值。

在您的統計信息頁面或其他任何內容中,您將獲得具有該代碼的在線用戶數:

SELECT COUNT(*) FROM users WHERE lastAction > (NOW() - 60*5)

完全錯誤的邏輯。 $ _SESSION是每用戶的事情。 一個用戶的會話不與任何其他用戶的會話共享。 想一想 - 用PHP編寫的在線銀行,所有人共享一個$ _SESSION - 每個人都會看到每個人的帳戶詳細信息。

假設您使用的是標准的基於PHP文件的會話,您可以將會話文件計算在它們存儲的任何目錄中,例如

$users = count(glob(session_save_path() . '/*'));

請注意,這只會計算會話文件 - 它無疑會包含尚未被垃圾回收的陳舊/死亡會話。 如果你想要一個真正的“真正在線”,你必須解析每個會話文件並檢查其內容。

PHP在會話存儲方面非常靈活,您可以定義自己的會話保存/恢復處理程序。

但是,默認會話存儲是files ,其中每個會話單獨存儲到磁盤。 這意味着,為了找出有多少用戶“ 在線 ”(這里,我假設“ 在線=會話存在與$_SESSION['$nickname']設置 ”),你需要打開存儲的所有會話文件在磁盤上,並檢查它們中存在多少個唯一的昵稱。 這在時間和所需資源方面都非常沉重。

因此,大多數教程建議在數據庫中對此進行計數,方法是維護每個用戶最后看到的時間戳(並檢查最后X分鍾內最后一次看到的用戶數)。

如果你想組合,可以通過定義你自己的會話保存處理程序來存儲數據庫中的會話信息...


關於會議的幾個附加說明:

  • 關閉瀏覽器時不會立即銷毀會話。 實際上,瀏覽器不會以任何方式告訴服務器它正在被關閉。 這意味着服務器應該提出一些基於時間的算法來決定誰在線以及誰不在線。
  • 會話彼此隔離,因此$_SESSION["foo"]不能由多個不同的會話共享 - 在PHP中沒有等同於Global.asa 沒有開箱即用。

這是錯誤的邏輯,並且會話僅在最終用戶的PC上本地存儲並立即銷毀,因此如果沒有用戶執行某些操作,則無法從服務器讀取任何類型的確認。 服務器端會話僅在垃圾清理時銷毀。

最好的辦法是為每個用戶設置一個時間戳,每當用戶做任何事情時都會更新。 這意味着您需要通過JS / AJAX,PHP觸發此更新。 然后,您可以查看過去5分鍾內有多少時間戳,例如,這可以讓您大致了解當前有多少用戶在線。

您還可以擁有一個隱藏的iframe,每隔幾秒鍾不斷刷新並更新時間戳,或者JS / AJAX每隔X秒更新一次時間戳...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM