我正在寻找一种方法,只删除存储的一定数量的SESSION数据,同时保留与登录用户相关的会话数据。
目前,我正在通过单个未设置语句对我要删除的SESSION变量执行此操作。
然而,我希望可能有一种更聪明的方法来删除SESSION数组的整个部分,同时保留特定的变量
e.g。
$_SESSION['username'];
$_SESSION['user_id'];
$_SESSION['ttl'];
此过程的用例是:
用户登录 - >用户执行任务 - >任务完成后,删除与任务相关的会话数据 - >用户仍然登录!
我考虑过在我的数据库监控登录中使用一个表,您对此有何看法?
谢谢你的时间!
答案 0 :(得分:3)
没有办法在保留特定变量的同时删除“SESSION数组的整个部分”。相反,您可以使用二维数组执行任务并删除该数组。
$_SESSION["task1"]["username"] = "name"
$_SESSION["task1"]["pass"] = "pass"
$_SESSION["task2"]["name"] = "name";
当task1完成删除时
unset($_SESSION["task1"]);
现在$ _SESSION [“task2”]仍然存在。
答案 1 :(得分: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'));
就DB而言,你可以做到这一点,但它没有必要实现你的目标,除非有你在原始问题中列出的移动部件,否则你可能不需要做任何复杂的事情。
答案 2 :(得分: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
答案 3 :(得分: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。
希望这有帮助。