3

我正在寻找一种方法来仅删除存储的特定数量的 SESSION 数据,同时保留与正在登录的用户关联的会话数据。

目前,我正在通过对要删除的 SESSION 变量的单独未设置语句来执行此操作。

但是我希望可能有一种更聪明的方法来删除 SESSION 数组的整个部分,同时保留特定变量

例如

$_SESSION['username'];
$_SESSION['user_id'];
$_SESSION['ttl'];

此过程的用例是:

用户登录 --> 用户执行任务 --> 任务完成后删除与任务关联的会话数据 --> 用户仍然登录!

我曾考虑在我的数据库监控登录中使用一个表,您对此有何看法?

谢谢你的时间!

4

4 回答 4

3

没有办法删除“SESSION 数组的整个部分,同时保留特定变量”。相反,您可以将二维数组用于任务并删除该数组。

$_SESSION["task1"]["username"] = "name"
$_SESSION["task1"]["pass"] = "pass"

$_SESSION["task2"]["name"] = "name";

当task1完成删除时

  unset($_SESSION["task1"]);

现在 $_SESSION["task2"] 仍然存在。

于 2012-01-24T17:24:19.763 回答
1

好吧,您可以将所有这些易失性数据存储在另一个键中:

$_SESSION['volatile'] = array(
   'one' => 'value'
);

如果您不想这样做,您可以使用数组比较函数,例如:

// specify what keys to keep
$_SESSION = array_intersect_key($_SESSION, array('keepme1', 'keepme2', 'etc'));

//specify what keys to remove
$_SESSION = array_diff_key($_SESSION, array('deleteme1', 'deleteme2', 'etc'));

就数据库而言,您可以这样做,但这并不是实现您的目标所必需的,除非您在原始问题中没有列出移动部件,否则您可能现在不需要做任何复杂的事情。

于 2012-01-24T17:20:45.377 回答
0

在层次结构中构建会话数据:

$_SESSION['loggedIn'] = TRUE;

// Temporary session data
$_SESSION['temporary'] = array(
    'temp_var1' => 'foo',
    'temp_var2' => 'bar',
    // ...
    'temp_var99' => 'baz'
);

echo $_SESSION['temporary']['temp_var2']; // bar

// Remove all temporary session data
unset($_SESSION['temporary']);

echo $_SESSION['loggedIn'] ? 'yes' : 'no'; // yes
于 2012-01-24T17:28:11.507 回答
0

我将不得不不同意@sathishkumar,以下方法会破坏部分会话变量。

public static function destroyPartial($keys)
{

    if (session_status() === \PHP_SESSION_NONE) {
        session_start();
    }

    if (!is_array($keys)) {
        $keys = [$keys];
    }
    foreach ($_SESSION as $k => $v) {
        if (in_array($k, $keys, true)) {
            unset($_SESSION[$k]);
        }
    }



    $recoveringSession = $_SESSION;
    session_destroy();
    session_start();
    $_SESSION = $recoveringSession;
}

在 session_destroy 函数的 php 文档中,我们可以读到:

session_destroy() 销毁与当前会话关联的所有数据。它不会取消设置与会话关联的任何全局变量,也不会取消设置会话 cookie。要再次使用会话变量,必须调用 session_start()。

所以,“诀窍”是在 session_destroy 之后调用 session_start。

希望这可以帮助。

于 2017-05-17T20:05:46.400 回答