Sleep如何在PHP中同时处理来自同一用户[机器]的请求?

时间:2015-09-16 16:12:48

标签: php session

我试图理解睡眠对来自同一台机器的多个请求的工作方式。

例如,我想在我的某个应用程序中跟踪用户登录和注销,并按照以下说明完成:

当用户尝试关闭/刷新当前浏览器时,会向浏览器发送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,因此不应重置用户会话。

但不知怎的,情况并非如此。我可能会在这里遗漏一些东西。

3 个答案:

答案 0 :(得分:0)

如果您想在关闭浏览器后销毁用户会话,只需设置cookie而不会过期日期。

答案 1 :(得分:0)

您只是在评论中解释了您的问题 - 而不是问题。每个http请求都是独立处理的,无论它们是否来自同一台机器,但是当客户端发出http请求时,它可能会重新使用现有连接,在这种情况下,请求将被阻止,直到同一套接字上的早期请求为止。处理。

  

我需要跟踪应用程序上用户的登录/注销活动

执行此操作的正确方法是会话处理程序中(并且不在会话内部嵌入时间信息)或通过SSO。您可以设置一个非常短的TTL并使用javascript调用的信标在没有显式注销的情况下获得更好的会话结束时间粒度。

答案 2 :(得分:0)

除非用户明确注销,否则不会发生注销事件。由于网站的工作方式,您无法强制用户注销。通常会话只是超时(30分钟是一个很常见的值)。如果及时注销对你很重要,可以考虑切换它并实现一个保持活动的自动收报机,它会定期(每5分钟?)向服务器发送一条消息,表明用户仍然登录(=在一个标签中打开网站)

在会话表中保留最后一次通知的时间戳,如果该时间戳太旧,则可以认为用户已注销。运行预定作业以记录退出'事件'。

使用onunload执行AJAX请求是非常不可靠的,因为您无法强制浏览器等待,并且您无法在重新加载/重定向或关闭之间进行分配。