2010-08-08 72 views
3

我有一個登錄系統。 使用我的登錄會話存儲和cookie(如果您「記住我」),然後登錄。當你在home.php的登錄系統中時(只有在註冊了會話/ cookie的情況下才能進入),我希望「用戶」表中的狀態字段在註銷時更新爲聯機和脫機。如何在線/離線

我知道如何做到這一點,當你登錄和註銷時更新狀態,但這裏是這樣的:當用戶離開網站時沒有註銷(按下實際的註銷按鈕),我該怎麼辦?我的意思是,如果狀態設置爲在線,並且您離開該頁面,它將保持在線,您可能會理解..logic ..那麼,在這種情況下我該怎麼做?我不想有一個難看的彈出窗口,當你離開頁面時會註銷你,這太舊了,太糟糕了。

或者,也許當會話用完,然後你設置狀態爲離線?但是,我應該怎麼做呢?

對此的解決方案的想法和例子會很好。

網站類似e.g臉譜,在聊天你改變現狀,如果你離開這個頁面,空閒,不知何故,如果你離開這個頁面並沒有去一段時間,你下線......怎麼樣,我不知道。

+0

[Pusher](http://pusher.com/)可能是解決方案! – gabitzish 2012-07-30 06:49:01

回答

4

Facebook有點討厭,因爲他們的頁面包含一些保持與聊天服務器開放連接的Javascript。一旦連接丟失,這意味着您已關閉該頁面(或您的互聯網連接),並將您標記爲離線。

通常,僅使用超時標記用戶在最後一次活動/頁面加載後的一段時間脫機。例如,這個超時的合理值可能是其會話cookie到期之前的時間。

+0

+1好的策略,我沒有想到這一點。 – Artefacto 2010-08-08 19:06:13

+0

@Wim你好,我不太瞭解你的sessiontimeout方法,它應該如何運行一個查詢後,用戶離開了頁面,並沒有點擊一些東西?服務器可以使用session-timeout或者自己運行查詢嗎?你能否也請提供一個小例子 – Karem 2010-08-08 19:14:22

+0

你的數據庫只包含上次訪問的時間,而不是實際的在線/離線字段。一旦你想知道在線/離線狀態(例如在另一個訪問者的頁面加載期間),從數據庫獲取最後訪問時間並從當前時間中減去它,然後與你的超時進行比較。 – Wim 2010-08-08 19:19:12

0

我該如何做,當用戶離開網站沒有註銷(按下實際註銷按鈕)?

嗯,你無法檢測。你可以做的最好的是「最後活躍」統計或「最近幾分鐘活躍的用戶」。在這種情況下,您應該更新每個用戶發出頁面請求的數據庫字段。

+0

是的,你可以(大部分)。 [看到這個](http://ajaxpatterns.org/Heartbeat) – NullUserException 2010-08-08 19:28:10

+0

@Null我看不出矛盾。這正是我所說的,除了年齡要求被強制在一段時間之外。 – Artefacto 2010-08-08 19:37:18

0

您可以在頁面加載上存儲時間戳,然後將在線/離線狀態設置爲過去的時間量。

0

你可以在用戶的​​表名爲LAST_VISIT例如現場,並與SYSDATE更新,現在(),等他訪問任何頁面時...

在,讓您的網上查詢用戶,您將與在該領域的用戶篩選它LAST_VISIT十分鐘少....

,如:

where last_visit < today-(10 minutes) 
1

簡單的解決方法是保存的最後訪問時間用戶,如果他真的註銷或者如果那時我認爲他是離線的過去太久了。

爲了獲得更好的解決方案(類似於facebook),您需要使用半永久性連接,並使用它們來檢測更細粒度的存在。

0

我想你應該做一些類似於AJAX推送的東西。 @Wim也提出了類似的方法。

+0

僅供參考@用戶名只能在註釋中使用,不能回答 – Wim 2010-08-08 19:37:28

+0

@Wim謝謝,有沒有辦法在答案中使用它們? – thelost 2010-08-09 04:32:00

+0

不是我所知道的。你可以在其他人的回答中發表評論,然後在那裏提及你自己的回答。 – Wim 2010-08-09 12:31:15

0

我已經在PHP從規範編寫的網站作爲一種業餘愛好最近的變化和我拿到這個是,在會話存儲在文件:

  • 有一個單獨的表格和列表用戶ID,last_update時間,會話ID
  • 在會話中存儲變量last_active
  • 在每個頁面上調用檢查上次活動時間是否小於30秒(或任何您想要的)如果時間更長則更新表在第一步,如果不繼續。這樣可以阻止你在每一頁上都需要打電話,並且在一分鐘左右的時間內就會準確無誤。

在數據庫中的會話ID是不必要的,只是很高興看到誰擁有什麼會話ID活躍,我甚至寫了一個有點hackish的功能來刪除一個手工基礎上,基於此標識的會話文件,如果我想把某人出門......沒有真正的理由,只是有點樂趣。

當然,如果您要將會話保存在數據庫中,那麼它會更容易,因爲無論如何,您要在每個頁面上執行數據庫之旅,因此更新並不是什麼大問題。

即使當頁面打開但未被主動刷新時,您也可以添加一些ajax以保持數據庫的更新,然後當其他人指出您通過檢查最後一次更新數據庫條目是否在任意範圍內想。