【问题标题】:What happens to the $_SESSION array if a PHP session times out in the middle of a request?如果 PHP 会话在请求中间超时,$_SESSION 数组会发生什么?
【发布时间】:2009-06-16 17:41:43
【问题描述】:

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

【问题讨论】:

    标签: php session session-timeout


    【解决方案1】:

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

    【讨论】:

    • 甚至默认的平面文件实现会阻止请求的会话超时,因为文件在 gc 可能运行之前打开(并锁定)。因此,即使 gc 是由您对 session_start() 的调用触发的,您也有可能加载一个非常旧的会话文件。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-18
          • 2020-09-10
          • 1970-01-01
          • 2021-05-17
          • 2018-07-21
          • 1970-01-01
          • 2016-12-10
          • 1970-01-01
          相关资源
          最近更新 更多