我试图理解睡眠对来自同一台机器的多个请求的工作方式。
例如,我想在我的某个应用程序中跟踪用户登录和注销,并按照以下说明完成:
当用户尝试关闭/刷新当前浏览器时,会向浏览器发送ajax请求。我所做的是在页面卸载时绑定一个事件,它在服务器上发送一个ajax请求,我在会话中设置会话时间戳值并使用sleep(10),如下所示 - >
//sets the timestamp value
$session->timestamp = time();
//wait if another request arrives withing 10 seconds
sleep(10);
if ($session->timestamp) {
//clear user session here
$session->timestamp = null;
}
由于我只想在用户尝试关闭浏览器标签/窗口时重置会话,因此在这种情况下它可以正常工作,并在10秒后重置会话。
但是,我不想在页面刷新的情况下重置会话。因为在页面刷新的情况下,再次首先调用页面卸载事件,它在会话中设置时间戳值,但是请求是用于刷新的,它将时间戳值设置在第一位,如下面的代码所示:
if ($session->timestamp) {
$session->timestamp = null;
}
现在我的想法是,在上一次请求的睡眠调用中完成10秒后,timestamp值被设置为null,因此不应重置用户会话。
但不知怎的,情况并非如此。我可能会在这里遗漏一些东西。
答案 0 :(得分:0)
如果您想在关闭浏览器后销毁用户会话,只需设置cookie而不会过期日期。
答案 1 :(得分:0)
您只是在评论中解释了您的问题 - 而不是问题。每个http请求都是独立处理的,无论它们是否来自同一台机器,但是当客户端发出http请求时,它可能会重新使用现有连接,在这种情况下,请求将被阻止,直到同一套接字上的早期请求为止。处理。
我需要跟踪应用程序上用户的登录/注销活动
执行此操作的正确方法是在会话处理程序中(并且不在会话内部嵌入时间信息)或通过SSO。您可以设置一个非常短的TTL并使用javascript调用的信标在没有显式注销的情况下获得更好的会话结束时间粒度。
答案 2 :(得分:0)
除非用户明确注销,否则不会发生注销事件。由于网站的工作方式,您无法强制用户注销。通常会话只是超时(30分钟是一个很常见的值)。如果及时注销对你很重要,可以考虑切换它并实现一个保持活动的自动收报机,它会定期(每5分钟?)向服务器发送一条消息,表明用户仍然登录(=在一个标签中打开网站)
在会话表中保留最后一次通知的时间戳,如果该时间戳太旧,则可以认为用户已注销。运行预定作业以记录退出'事件'。
使用onunload
执行AJAX请求是非常不可靠的,因为您无法强制浏览器等待,并且您无法在重新加载/重定向或关闭之间进行分配。