1

在这里,我发布了一个示例代码,它给了我正确的结果。这意味着如果我在 60 秒内不执行任何操作,那么我会自动从页面注销。让下面的代码

<?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 秒并且能够销毁会话的。请解释一下这背后的概念!

4

1 回答 1

1

考虑您是第一次致电该网站。我们假设当前时间戳为 100。那么 的值$_SESSION["timeout"]将被设置为 100。

请注意time()to的赋值在脚本$_SESSION["timeout"]的末尾。

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

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

现在的值是:

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

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

于 2013-08-01T07:54:25.497 回答