我是ROR的新手。我试图在我的rails应用程序中找到在线用户。 我提出了一个想法,但不确定这是否是一个更好的选择。请有人在我的想法中提出建议。
我的想法是,
维护包含字段的表(id,user_id,last_pinged_at) 这个last_pinged_at每次都要更新,直到用户登录为止。
使用此last_pinged_at值来查找用户是否在线?
上述想法是否是更好的选择。
答案 0 :(得分:2)
您的另一个选择是在用户关闭浏览器时退回,或者离开网站。
有两种方法可以做到这一点。
第一个是非常黑客攻击,即将您的网站放在一个框架中,当外部页面收到window.onbeforeunload事件时,您知道他们将离开您的网站。您可以使用此事件向服务器发送AJAX ping,告知您已离开
或者,您可以捕获您网站上的所有点击,以及任何onbeforeunload事件,如果它们与最近的点击无关,那么您就知道他们将离开您的网站。但是,如果用户在点击后的页面加载期间离开您的网站,则这可能不可靠。
我建议你的方法更好,因为它更可靠,但不太准确。记录上一次活动,如果超过一定时间,则认为用户已退出(就像会话在状态良好的应用程序世界中一样)。
答案 1 :(得分:2)
是的,你的建议没问题,但在我看来,'last_seen_at'是一个比'last_pinged_at'更好的名字:“last_pinged_at”听起来好像你正在ping他们,即发送一个ping他们的IP地址,你'不。
许多登录/身份验证系统,例如Authlogic,都是理所当然的。您有两个主要选项,具体取决于您希望last_seen_at字段的最新状态。
a)在用户登录时更新用户的last_seen_at。如果用户可以保持登录状态数天,则这不是很有用。
b)在每次加载页面时更新用户的last_seen_at(这就是堆栈溢出所做的事情 - 点击页面顶部的名字,它会说“最后一次看到0秒前”)。这将使数据保持最新。最简单的方法是将一个方法放在应用程序控制器的before过滤器中,以设置current_user(通常存储在实例变量@current_user中),并将当前用户的last_seen_at字段更新为Time.now。
c)每隔五秒左右,让一些js向服务器发送“我仍然在这里”的消息。这将使时间保持最新,但显然是额外的服务器负载。关于“使用此last_pinged_at值来查找用户是否在线?”:这取决于您是否真的需要知道他们是否在线,即它是否对您网站的“商业模式”至关重要。 rails服务器是无状态的,并且没有活动连接的概念 - 只是一系列离散请求。所以,你真正能说的最好的是“我从请求中得到了用户最近登录的证据”。您最近需要的是确定您需要哪种方法。
例如,如果您正在构建聊天室类型的事物,那么您确实需要知道某人何时关闭窗口,因为这会有效地将其记录在聊天之外。在这种情况下,我不会试图抓住他们实际离开的行为(正如Mytest建议的那样),因为有太多的方法可以做到这一点(例如关闭浏览器) - 很难让它真正可靠。我只会进行轮询方法,例如每5秒发送一次后台请求。在这种情况下,您可以制定一条规则,如果last_seen_at超过十秒钟,那么它们将被视为已退出。