这里我发布了一个示例代码,它给出了正确的结果。这意味着如果我没有做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秒并且能够破坏会话。 请解释一下这背后的概念!
答案 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,所以条件块将被执行,会话将被销毁。