部分删除/销毁 $_SESSION 数据? PHP

Posted

技术标签:

【中文标题】部分删除/销毁 $_SESSION 数据? PHP【英文标题】:Partially delete/destroy $_SESSION data? PHP 【发布时间】:2012-02-17 22:49:57 【问题描述】:

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

目前,我正在通过对要删除的 SESSION 变量的单个 unset 语句执行此操作。

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

例如

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

这个过程的用例是:

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

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

感谢您的宝贵时间!

【问题讨论】:

您可以对数组进行 for_each 以取消设置除您想要的之外的所有内容。另一种方法是您可以将要设置 $_SESSION 的变量保存到新数组中,然后将 var 放回其中。 【参考方案1】:

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

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

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

当task1完成删除时

  unset($_SESSION["task1"]);

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

【讨论】:

【参考方案2】:

您可以将所有这些易失性数据存储在另一个密钥中:

$_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'));

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

【讨论】:

【参考方案3】:

按层次结构构建会话数据:

$_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

【讨论】:

【参考方案4】:

我不得不不同意@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。

希望这会有所帮助。

【讨论】:

以上是关于部分删除/销毁 $_SESSION 数据? PHP的主要内容,如果未能解决你的问题,请参考以下文章

PHP7中如何设置session和销毁session

原生php使用sessioncookie

如何通过 apache 清除 PHP $_SESSION?

PHP session_destroy()警告会话对象销毁失败[重复]

session

在 PHP 中销毁会话时出错