部分删除/销毁 $_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的主要内容,如果未能解决你的问题,请参考以下文章