会话超时如何在网站中运行

时间:2013-08-01 07:45:16

标签: php

这里我发布了一个示例代码,它给出了正确的结果。这意味着如果我没有做60秒的任何动作,我将自动从page.let中注销,代码如下

<?php
session_start();
// set time-out period (in seconds)
$inactive = 600;

// check to see if $_SESSION["timeout"] is set
if (isset($_SESSION["timeout"])) {
    // calculate the session's "time to live"
    $sessionTTL = time() - $_SESSION["timeout"];
    if ($sessionTTL > $inactive) {
        session_destroy();
        header("Location: /logout.php");
    }
}

$_SESSION["timeout"] = time();

现在问题是在ISSET()函数内部我们正在计算$ sessionTTL。现在我们有两个操作数,第一个是time(),它给出当前时间,第二个是$ _SESSION [“timeout],这个超时也包含当前时间,所以两者的差异始终为零。那么这段代码如何能够证明我闲置60秒并且能够破坏会话。 请解释一下这背后的概念!

1 个答案:

答案 0 :(得分:1)

考虑您是第一次使用该网站。我们假设当前时间戳为100.然后$_SESSION["timeout"]的值将设置为100。

请注意,time()$_SESSION["timeout"]的分配位于脚本的末尾

5秒后,用户点击一个链接,在这五秒钟之后访问另一个页面。然后将执行脚本并计算$sessionTTL = time() - $_SESSION["timeout"];。由于现在我们还有五秒钟,time()将返回105.但是,$_SESSION["timeout"]仍将包含100,因为它将在脚本末尾再次设置(脚本尚未到达)但在执行期间)。 差异将是5秒。从5&lt; 600,将不再采用分支,并且$_SESSION["timeout"]可以再次设置为当前时间(105)。

现在用户等待20分钟,即1200秒。然后他点击了一个链接。

现在的值是:

$_SESSION["timeout"]: 105
time(): 1305

所以这次的差异将是1200,因此大于600,所以条件块将被执行,会话将被销毁。