如果PHP会话在请求中间超时,$ _SESSION数组会发生什么?

时间:2009-06-16 17:41:44

标签: php session session-timeout

我一直想知道,如果PHP会话在执行脚本的过程中超时,那么在脚本执行结束之前,$ _SESSION数组的内容是否仍然可用?例如:

session_start();

if(! isset($_SESSION['name'])) {
    echo 'Name is not set';
    exit;
}

// imagine there is a bunch of code here and that the session times out while
// this code is being executed

echo 'Name is ', $_SESSION['name']; // will this line throw an error?

将会话变量复制到本地作用域是否切实可行,以便稍后在脚本中读取它们而不必继续检查会话超时?类似的东西:

session_start();

if(isset($_SESSION['name'])) {
    $name = $_SESSION['name'];
} else {
    echo 'Name is not set';
    exit;
}

// bunch of code here

echo 'Name is ', $name;

4 个答案:

答案 0 :(得分:7)

不要担心这样的事情。会议什么都不会发生。它由sessioni_start()初始化,$_SESSION将始终在您的脚本中提供。

答案 1 :(得分:2)

每次打开会话时都会重置默认的三小时会话生存期(请参阅session_cache_expire),因此会话在请求过程中超时的唯一方法是请求需要三个小时才能完成处理。默认情况下,PHP在30秒后请求超时,因此在请求期间没有会话到期的危险。此外,$_SESSION变量在请求中间不会突然改变。它会在会话开始时填充,就是这样。

答案 2 :(得分:2)

变量在初始请求时被复制到$ _SESSION全局变量中,因此它与将其复制到局部变量具有相同的效果。

但是,为清楚起见,将其复制到局部变量是有意义的。特别是如果您打算多次使用该变量。在整个地方读取具有$ _SESSION ['variable']的代码可能很困难。

答案 3 :(得分:0)

您需要了解的是会话如何运作。使用$ _SESSION超级全局访问脚本的客户端只知道属于它们的会话的密钥(存储在Cookie / URL中)。这意味着会话数据本身与客户端无关。如果您拥有要使用的会话数据的密钥,则可以使用它。较旧版本的PHP存在一些安全漏洞,因为会话存储在易于访问的某个地方(我不记得细节)。

基本上,如果你在PHP脚本中有会话ID,你可以访问该会话,除非机器上的内存被刷新/硬盘损坏(即计算机重启/设备故障)。

希望这会有所帮助,否则请访问php.net并深入了解会话的工作方式。