Tempdata指的是一种带有有效时间的 session 数据, 当它的有效时间已过期,或在有效时间内被删除,都会自动被清除。
tempdata 也是常规的 session 变量,只不过以特殊的方式保存在 ‘__ci_vars’ 键下
源码的体现是:在本次请求或本页面中,调用tempdata时不会判断过期的,哪怕超过了时间。只有在下一个页面请求调用时,才会判断是否过期。
设置session临时数据及过期时间
$this->session->set_tempdata('item', 'value', 300);
标记session变量为临时数据及过期时间
$this->session->mark_as_temp('item', 300);
单个方式
$this->session->mark_as_temp(array('item', 'item2'), 300);
数组方式
$this->session->mark_as_temp(array(
'item' => 300,
'item2' => 240
));
核心就是:$_SESSION['__ci_vars'][$key] = $ttl;
为$key存储一个过期时间,然后调用的时侯判断过期没有
标记数据
public function mark_as_temp($key, $ttl = 300)
{
//过期时间点
$ttl += time();
//设置数组数据的两种方式
if (is_array($key))
{
$temp = array();
foreach ($key as $k => $v)
{
// Do we have a key => ttl pair, or just a key?
if (is_int($k))
{
$k = $v;
$v = $ttl;
}
else
{
$v += time();
}
if ( ! isset($_SESSION[$k]))
{
return FALSE;
}
$temp[$k] = $v;
}
$_SESSION['__ci_vars'] = isset($_SESSION['__ci_vars'])
? array_merge($_SESSION['__ci_vars'], $temp)
: $temp;
return TRUE;
}
//设置单个数据
if ( ! isset($_SESSION[$key]))
{
return FALSE;
}
$_SESSION['__ci_vars'][$key] = $ttl;
return TRUE;
}
获取数据
public function tempdata($key = NULL)
{
//获取单个session临时数据
if (isset($key))
{
return (isset($_SESSION['__ci_vars'], $_SESSION['__ci_vars'][$key], $_SESSION[$key]) && is_int($_SESSION['__ci_vars'][$key]))
? $_SESSION[$key]
: NULL;
}
$tempdata = array();
//获取所有session中的临时数据
if ( ! empty($_SESSION['__ci_vars']))
{
foreach ($_SESSION['__ci_vars'] as $key => &$value)
{
is_int($value) && $tempdata[$key] = $_SESSION[$key];
}
}
return $tempdata;
}
过期实现:
在本次请求或本页面中,调用tempdata时不会判断过期的,哪怕超过了时间。
只有在下一次页面请求调用Session构造函数时(如:
this−>load−>library(‘session′)),才会判断所有临时变量是否过期,并清除已过期的。如果过期时间小于当前时间,则unset(
_SESSION[
key],
_SESSION['__ci_vars'][$key])
if ($value < $current_time)
unset($_SESSION[$key], $_SESSION['__ci_vars'][$key]);