CodeIgniter框架源码笔记(12)——SESSION类之临时数据TempData实现

来源:互联网 发布:网络歌手麦克风图片 编辑:程序博客网 时间:2024/05/27 19:26

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]);
0 0