3

我一直想知道,如果 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

4 回答 4

7

不要担心这些事情。会话不会发生任何事情。它由您的脚本初始化sessioni_start()并将$_SESSION 始终在您的脚本中可用。

于 2009-06-16T17:47:31.883 回答
2

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

于 2009-06-16T17:56:58.843 回答
2

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

但是,为了清楚起见,将其复制到局部变量是有意义的。特别是如果您计划多次使用该变量。可能很难阅读到处都有 $_SESSION['variable'] 的代码。

于 2009-06-16T18:00:42.033 回答
0

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

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

希望这会有所帮助,否则请访问 php.net 并深入了解会话如何工作的详细信息。

于 2009-06-16T17:52:56.260 回答