聊天室, 偵測使用者是否在線 - Google

Table of Contents



hi, 想必大家在寫聊天室的時候, 都會遇到這個問題

用 JavaScript 的 onunload 只要碰到突然離線(ex: 網路線拔掉)就沒用了

如果是寫個程式, 定期(每隔1秒) send HTTP request 給 server 端的程式,

例如每一秒都用 AJAX send "True" 給 server

也就是把每個 user 最後回報的時間更新進 MySQL 裡,

然後就可以偵測, 看哪個使用者超過了 20 秒都沒有回報, 就知道他下線了。

問題來了, 假如使用者離線了, 沒有 php 程式可以運作, 根本沒有辦法

「看看哪個使用者超過了 20 秒都還沒回報」啊!

如果把這個行為, 交給其他還在線上的人, 由他們來執行 php 程式

好像也不太理想, 假設聊天室有一萬位 user 好了,

每隔 1 秒, 就有一萬次的 MySQL query:

"UPDATE users SET whether_login='False' where
last_report_time-NOW()>......" (詳細 syntax 我沒背)

伺服器負荷不會太大嗎?

第二個問題是, 假設整個聊天室就只有你一個人,

結果你家網路線突然被拔掉. 在 MySQL 那裡,

你的 whether_login 欄位還是個 True 呢,

整個聊天室裡也只有你一個人, 你一走,

就沒有人可以幫你把 whether_login 調成 False 了

改天你登入的時候, 因為 whether_login 還是 True,

所以系統認為是重複登入, 不讓你登入了, 那怎麼辦呢?

--

All Comments

Harry avatarHarry2011-07-20
如果你的資料只存boolean, 那幹嘛不直接判斷timestamp有沒
有更新就好?
Rachel avatarRachel2011-07-24
恩...我比較笨一點 看不懂 這和Google有關係?
Dora avatarDora2011-07-29
無關