V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hussion
V2EX  ›  问与答

如何判断用户离开状态?

  •  
  •   hussion · 2015-03-23 17:02:55 +08:00 · 4641 次点击
    这是一个创建于 3539 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如何判断一个用户是否离开站点?

    比如:
    1. 现在只打开一个tab访问v2ex,然后把该tab关闭了
    2. 直接关闭浏览器
    以上两种都算离开站点了

    如果用户一直打开站点,没有关闭,则不算作离开站点。

    总而言之:只要有任何一个tab页在打开着站点,就不算作离开站点。

    该如何准确实现记录呢?

    第 1 条附言  ·  2015-03-23 17:48:05 +08:00
    补充下: 刷新页面不算作用户离开~
    22 条回复    2015-03-25 09:44:15 +08:00
    ryd994
        1
    ryd994  
       2015-03-23 17:38:07 +08:00 via Android
    挂一个js,一直发ajax签到
    typcn
        2
    typcn  
       2015-03-23 17:39:31 +08:00
    开一个 WebSocket 连接,切换 Tab 之后,浏览器就不会再继续处理这个 WebSocket 的消息。
    关掉这个 Tab 之后, 服务器会瞬间收到 Socket Close
    zgxltxz
        3
    zgxltxz  
       2015-03-23 17:40:25 +08:00 via Android
    不限时session
    hussion
        4
    hussion  
    OP
       2015-03-23 17:46:24 +08:00
    @typcn 页面刷新的时候,也会触发socket close事件的
    hussion
        5
    hussion  
    OP
       2015-03-23 17:49:27 +08:00
    @zgxltxz 这个没法判断用户是否离开啊?
    imn1
        6
    imn1  
       2015-03-23 17:55:24 +08:00
    目前通用做法是 session 超时,这个是属于延时判断,非实时
    实时判断需要长连接或者server push/client pull,参考chat room
    loading
        7
    loading  
       2015-03-23 17:55:29 +08:00
    mousemove
    blur
    hussion
        8
    hussion  
    OP
       2015-03-23 18:11:08 +08:00
    @imn1 这个和2楼一样,页面刷新的时候,解决不了
    hussion
        9
    hussion  
    OP
       2015-03-23 18:12:42 +08:00
    @loading 监听mousemove,这数据量要疯的~而且解决不了问题
    rock_cloud
        10
    rock_cloud  
       2015-03-23 18:19:30 +08:00
    @hussion 没关系吧,原来的断了,新的又连上了,不是照样可以知道用户在线么。
    hussion
        11
    hussion  
    OP
       2015-03-23 18:20:35 +08:00
    @rock_cloud 问题就再也你如何判定何时离开
    Havee
        12
    Havee  
       2015-03-23 18:53:45 +08:00
    b/s的为什么非要做成c/s的,你确认你服务器吃得消?
    airyland
        13
    airyland  
       2015-03-23 19:43:28 +08:00   ❤️ 1
    @hussion 这个我处理过。socket close 时不是立即设置offline, 而是延时5s后才offline。当刷新页面后socket connect时清除offline定时器就行了。
    futursolo
        14
    futursolo  
       2015-03-23 19:55:51 +08:00
    WebSocket + 延时(超过1s才算断开)
    Tink
        16
    Tink  
       2015-03-24 00:53:06 +08:00 via iPhone
    @airyland 这个办法好像很好
    gihnius
        17
    gihnius  
       2015-03-24 08:32:21 +08:00
    hussion
        18
    hussion  
    OP
       2015-03-24 09:55:30 +08:00
    @ryd994
    @gihnius

    目前就是这种实现方式,对服务器压力太大,准备改造
    hussion
        19
    hussion  
    OP
       2015-03-24 09:58:59 +08:00
    @airyland 这个是比较靠谱些的,我们之前也想到这样做 :)
    hussion
        20
    hussion  
    OP
       2015-03-24 10:00:12 +08:00
    @housne 这个方法不靠谱的,用户的各种诡异行为(比如突然关闭浏览器)以及网络问题,都会导致很大误差,比例大概是:10%~30%
    invite
        21
    invite  
       2015-03-24 17:49:45 +08:00
    @hussion js方案对服务器压力大?想不出比这压力更小的了。如果用长连接,你的服务器更加吃不消了吧。
    hussion
        22
    hussion  
    OP
       2015-03-25 09:44:15 +08:00
    @invite ajax轮询无论是从效率还是资源耗费上,都劣于采用websocket进行长链接通信
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2474 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:03 · PVG 09:03 · LAX 17:03 · JFK 20:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.