我現在是用一個作法,可以知道對方是否有在線上
就是透過 ajax + timeout 去每30秒問一次是否還在線上,是的話就更新現在的時間戳
然後用現在的時間去扣除使用者自己更新的時間,假設低於20秒就表示在線
扣除超過 30秒就是離線
只是現在有個問題
我想要知道對方是否已經關閉瀏覽器,或是離開網站了
任何離開網站的行為我可以知道那個時間點?然後作出對應的處理?例如把他某樣資料從資料庫裡刪除,就是在離開的當下可能過一分鐘就可以知道?這可以用啥技術實現?
我雖然可以知道他最後上線的時間戳
但這樣我沒辦法利用自動的方式做處理~只知道他確實離線而已
其實啊,這個問題算是真的很有深度了。也是一直是許多人在討論的問題。
我先說說我的做法。
我大多數會用定時制的方式,去更新目前登入的用戶時間。目前設定是平均15~30秒更新一次資料。
然後後台會判斷5分沒更新過的就會視為離線。
網頁的ajax更新,超過15分的話。也會停止更新。(這是在防網頁崩潰)
當然,這樣的做法。還是會有5分的誤差。但這還算是我們可以接受的範圍。
曾經有試過每秒更新。但太操了。
而beforeunload或是單純的unload事件。早期也想要利用這個。丟ajax方式運行離開。
雖然這招可行,但實際試驗的結果。其實平均10次會有1~4次的不運行記錄。
sock當初也是在我的考量範圍。不過那時要求的準確度並沒需要說要到秒的地步。
再加上我又很懶的處理sock的東西。所以這部份我就沒研究過了。
ps:雖然最近要寫聊天室。可能還是需要用到。
因為如果他不在線上 settimeout 不就沒有作用了嗎?假設我1:30秒問你,你還在線上,所以我更新時間戳
但是你1:40就離開網站了,此時我的 ajax 不就沒有作用了?
就是要利用,一但關閉了頁面,ajax就不會動作的特性。
自然就不會在更新「在線時間」了
離線的動作判斷時機點,就得看你要做的事情有哪些了。
你有說到了一個方式,就是定期一個小時去檢查。
這就是用crontab制。不過一般我會每10分檢查就是了。
另一種是連動檢查。也就是在做更新(無論是誰)時。就順便連動檢查處理。
當然,這樣做的缺點就是,最後一位線上的人。永遠都不會更新資料了。因為沒人可以連動更新了。只是,如果你的站的人氣真的那麼差的話
可能你不明白這樣做的用意。
因為網頁真的很難做到即時性離線判斷。
所以用的方式,也只是利用在線時間標記特性。
因為我們可以做到的是,我可以確定你還在這個網站。
但做不到你是否還在電腦前的判斷。
方法有很多種,重點在於你要怎麼去思考轉過來。