在 PHP 中设置会话超时

Subodh Poudel 2023年1月30日
  1. 在 PHP 中使用 session_unset()session_destroy() 函数设置会话超时
  2. 在 PHP 中使用 unset() 函数设置会话超时
  3. 在 PHP 中使用 session_regenerate_id() 函数更改当前会话 ID
在 PHP 中设置会话超时

本文将介绍一种在 PHP 中使用 session_unset()session_destroy() 函数销毁会话的方法。我们将在 30 分钟后销毁会话。它检查从最后一个活动到当前时间的时间间隔以销毁会话。

我们还将演示使用 unset() 函数在 PHP 中设置会话超时的另一种方法。unset() 函数将会话变量作为参数。此方法使用数组来存储会话变量。

我们将介绍另一种使用 session_regenerate_id() 函数使当前会话 ID 无效的方法。该函数为当前会话生成一个新的会话 ID,破坏先前的会话 ID。

在 PHP 中使用 session_unset()session_destroy() 函数设置会话超时

我们可以使用 session_unset() 函数在运行时取消设置 $_SESSION 变量,并使用 session_destroy() 函数从存储中销毁会话。time() 函数返回当前时间。我们可以使用 $_SESSION 变量来存储最后一个活动的时间戳。因此,我们可以通过计算从上次活动到当前时间的差异来检查时间。这样,我们检查一个会话的时间间隔。

例如,使用 session_start() 函数在服务器中启动会话。检查会话是否已使用 isset() 函数创建。使用 && 运算符检查 isset() 函数内的其他条件。从 time() 函数中减去会话变量 start 并检查结果是否大于 1800。在 if 条件中使用 session_unset()session_destroy()。然后显示会话已被销毁的消息。在 if 条件之外,创建一个会话变量 $_SESSION['start'] 并为其分配 time() 函数以更新会话。

if 条件失败,因为在下面的示例中尚未创建会话变量。当条件失败时将创建会话。如果用户没有向服务器发送请求,会话将在 30 分钟后过期。isset() 函数的后半部分检查会话的总活动时间。1800 表示 1800 秒,相当于 30 分钟。如果总活动时间超过 30 分钟,则 if 条件为真。然后,它会破坏会话。代码的输出对应于活动时间超过 30 分钟后被销毁的会话。查看 PHP 手册 以了解有关 session_unset() 函数的更多信息。

示例代码:

# php 7.*
<?php
session_start();
if (isset($_SESSION['start']) && (time() - $_SESSION['start'] > 1800)) {
    session_unset(); 
    session_destroy(); 
    echo "session destroyed"; 
}
$_SESSION['start'] = time();
?>

输出:

session destroyed

在 PHP 中使用 unset() 函数设置会话超时

我们可以使用 unset() 函数来销毁 PHP 中特定会话变量的会话。该函数将 $_SESSION 变量作为参数。此方法将会话存储在一个数组中。我们可以使用关联数组来存储会话名称和会话开始时间。我们可以使用 time() 函数来获取当前时间。我们可以按照上面提到的方法检查会话时间间隔,从当前时间中减去活动会话时间。

例如,使用 session_start() 函数来启动会话。编写一个会话变量 $_SESSION['start'] 并为其分配一个关联数组。写入键 0registered 并为相应的键写入值 activetime()。检查时间间隔是否大于 30 分钟。如果条件为真,则编写带有 $_SESSION['start'] 作为参数的 unset() 函数。然后,显示消息 session destroyed。在 if 条件块之外,使用 time() 函数更新会话变量 $_SESSION['start']

在下面的示例中,数组包含会话变量。会话变量的值为 activetime() 函数在数组中创建当前时间戳,键 registered 保存该值。请查看 PHP 手册 以了解有关 $_SESSION 超全局变量的更多信息。

示例代码:

#php 7.x
<?php
session_start();
$_SESSION['start'] = array(0=> 'active', 'registered' => time())
if ((time() - $_SESSION['start']['registered']) > (60 * 30)) {
    unset($_SESSION['start']);
    echo "session destroyed";
}
$_SESSION['start'] = time();
?>

输出:

session destroyed

在 PHP 中使用 session_regenerate_id() 函数更改当前会话 ID

我们可以使用 session_regenerate_id() 函数来更改当前会话的会话 ID。通过这种方式,我们可以防止我们的脚本会话固定。函数中的布尔值 true 可以生成新的 session-id。在这个方法中,我们可以在重新生成会话 id 之前和之后使用 session_id() 函数打印会话 id。但是会话不会随着 session-id 的变化而过期。它只要求用户再次登录。因此,它可以防止会话固定。

例如,使用 session_id() 函数启动会话。使用 session_id() 函数显示当前会话 ID。检查会话是否已创建并创建会话 $_SESSION['start'] 并分配 time() 函数。找到会话处于活动状态的时间间隔,就像我们在上述方法中所做的那样。如果条件为真,则使用 session_regenerate_id(true) 函数。更新会话变量。在脚本的末尾,使用 session_id() 函数打印新的会话 ID。

示例代码:

#php 7.x
<?php
session_start();
print("Old: ".session_id());
echo "<br>";
if (!isset($_SESSION['start'])) {
    $_SESSION['start'] = time();
} else if (time() - $_SESSION['start'] > 1800) {
    session_regenerate_id(true); 
    $_SESSION['start'] = time(); 
}
print("Now: ".session_id());
?>

输出:

​Old: t38kssej37un38mtsoa6lovh05 
Now: mak7i3in708c6rl2udd8gbfo3r ​ ​
作者: Subodh Poudel
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn

相关文章 - PHP Session