我正在使用Node.js(Express框架)和socket.io做一個實時網站,在某些時候它必須檢測某人是否在線(這基本上是如果有人打開網頁)。Facebook如何知道某人是否在線
我認爲Facebook聊天就是這樣的一個例子。但是它背後的工程邏輯是什麼?
非常感謝!
我正在使用Node.js(Express框架)和socket.io做一個實時網站,在某些時候它必須檢測某人是否在線(這基本上是如果有人打開網頁)。Facebook如何知道某人是否在線
我認爲Facebook聊天就是這樣的一個例子。但是它背後的工程邏輯是什麼?
非常感謝!
不確定Facebook是如何做到這一點的,但是如果您向擁有javascript的用戶提供頁面,這會使得每隔一分鐘就會以特定間隔發出異步請求。然後,當您收到一個請求時,用戶將被標記爲在線,超時時間稍長於ajax時間間隔。如果超時沒有另一個Ajax請求,則用戶標記爲離線。
您可能會掛鉤頁面加載和頁面關閉事件,以便只在用戶加載頁面或離開頁面時發送請求。這將需要較少的請求。
編輯
我你使用套接字IO我不是超級熟悉,但我想你可以使用所提供的插座連接/斷開事件看。
感謝您的答案。我目前正在使用頁面加載/關閉事件,但當用戶在多個選項卡中打開網頁時會變得雜亂無章。它也可以搞砸,當用戶保持按F5瘋狂 –
你好,我想頁面關閉事件會導致多個選項卡的問題。 http://stackoverflow.com/questions/12166187/manage-multiple-tabs-but-same-user-in-socket-io這可能會幫助 – djbrick
http://stackoverflow.com/questions/1051895/whats-the-easiest -way-to-determine-is-a-user-in-online-php-mysql在一個時間間隔上進行ping操作似乎是一種常見的解決方案 – djbrick
客戶端定期向服務器發送保持活動消息,在客戶端JS中實現。
如果服務器在某個超時期間內未收到保持活動狀態,則可以將該用戶標記爲離線。它也可以在websocket明確關閉時這樣做。
來自Facebook的此幻燈片(http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf)詳細解釋了其消息傳遞系統。該系統具有彗星(通道)羣集,該羣集與瀏覽器保持TCP連接,並定期將連接的用戶列表推送到Presence服務器。因此,如果用戶在線或不在線,網頁(PHP)可以查詢Presence Server。
您使用何種形式的用戶認證? –
這是在登錄頁面之後。在登錄頁面這是一個標準POST請求發送到服務器進行數據庫用戶認證 –