CI3的Session的重大改变就是默认使用了原生的Session,这符合Session类库本来的意思,似乎更加合理一些。总体来说,虽然设计理念不同,但为了保证向后兼容性,类库的使用方法与CI2.0的差别不是很大。一般的使用过程是这样的:

写数据

1 //直接加载默认的files驱动器
2 $this->load->library('session');
3 $this->session->set_userdata('some_name', 'some_value'); //单个数据
4 $newdata = array(
5         'username'  => 'johndoe',
6         'email'     => 'johndoe@some-site.com',
7         'logged_in' => TRUE
8 );
9 $this->session->set_userdata($newdata); // 数组,适合一次保存多个数据的情形。

这跟CI2.0几乎没有区别。接下来看读取Session数据的方法。

读数据

1 $name = $_SESSION['name']; // 直接使用,似乎是官方推荐的方法
2 $name = $this->session->name ; //使用魔术方法,session的名称name变成了session对象的一个属性。
3 $name = $this->session->userdata('name'); //与CI2的使用方法一样,为保持向后兼容性的一种用法

另外一点需要注意,CI3开始,如果返回的数据是空,以前都会置为 FALSE,现在则会 NULL。 所以以前的写法:

1 $name = $this->session->userdata('name');
2 if($name === FALSE){
3 //……
4 }

需要换成:

1 $name = $this->session->userdata('name');
2 if($name === NULL){
3 //……
4 }

可以使用以下方法判断是否含有某个名称的session:

1 if($this->session->has_userdata('some_name')){
2 }
3 //或者
4 if(isset($_SESSION['some_name'])){
5 }

删除数据

删除的话则和以前类似:

01 unset($_SESSION['some_name']);
02 //或者批量删除
03 unset(
04         $_SESSION['some_name'],
05         $_SESSION['another_name']
06 );
07 //or
08 $this->session->unset_userdata('some_name');
09 //或者批量删除
10 $array_items = array('username', 'email');
11 $this->session->unset_userdata($array_items);

总体上看,CI3的Session类库设计理念是更加接近原生的函数和方法,同时为了保持向后兼容性,原来的方法也尽量保留了下来。于此同时,原来的flash data理念做了新的设计,加入了temp data的概念,那么这两个data有什么区别呢?

flash data  、 temp data 与user data的区别

这三种session数据的名字是CI约定俗成的,指代的内容是不一样的,并不存在包含关系。不要错误地认为user data包含flash data或者temp data。在CI的api设计中,分别应用不同场景:

1. flash data的主要特征是:保存的数据是一次性数据,在下次请求中用过一次就没了。本质上讲,flash
data跟普通的session数据无异,CI不过是对该类data的名称做出了特殊标记,保证了它们拥有了只能用一次的特征,所以你可以使用以下方法将
普通的user data标记为flash data:

1 $_SESSION['item'] = 'value'; //先有一个session
2 $this->session->mark_as_flash('item'); // 单个标记成flash data,item是session的名称
3 $this->session->mark_as_flash(array('item', 'item2')); //批量标记
4 //或者一次性的标记,不再是先有session,再标记成flash data的过程
5 $this->session->set_flashdata('item', 'value');

flash data的适用场景是:将操作结果返回到下一次请求的页面上。比如有个保存操作,提交后会跳转到一个新的页面,你可以使用flash data保存一句话“保存已成功”,该句话只在跳转的页面显示一次,再次刷新跳转页面,就不会显示了。

2. temp data的主要特征是:
保存的数据在规定的时间内有效,它的生命期由方法$this->session->set_tempdata('item',
'value',
300)设置,其中的300意思是该session数据的有效期为5分钟,超过规定时间(即便是session还没过期)就会失效,它的时效性介于
flash data 和user data 之间。它和flash data在本质上是类似的,也可以从普通的session转化过来:

01 $_SESSION['item'] = 'value';
02 $this->session->mark_as_temp('item', 300); //标记item的生命期只有300s
03 $this->session->mark_as_temp(array('item', 'item2'), 300); //批量将生命期标记为300s
04 //分别标记成不同的生命期
05 $this->session->mark_as_temp(array(
06         'item'  => 300,
07         'item2' => 240
08 ));
09  
10 $this->session->set_tempdata('item', 'value', 300);//直接设置一个temp data,常用方法

temp data的适用场景是:保存一些更加细粒度的、更加隐私的session数据。比如某些令牌token,比较重要,为了安全让它的生命期更短一些,可以保证安全。temp data的设计从某种方面保证了session拥有不同生命期的数据。

3. user data的主要特征是:保存的数据在session有效期内均有效,它的生命期由sess_expiration设置,一般默认是7200s,而且它也是生命期最长的。

flash data  、 temp data 与user data的读取

CI Session类中的flash data、temp data与user data,都能以$_SESSION['item'] 的方式获取到。同时又可使用各自的方法获取到:

01 echo $_SESSION['item']; //三种类型的数据都能得到
02  
03 $this->session->flashdata('item'); // 获取flash data
04 $this->session->flashdata(); //获取全部flash data
05  
06 $this->session->tempdata('item'); //获取temp data
07 $this->session->tempdata(); //获取全部temp data
08  
09 $this->session->userdata('item'); // 获取user data
10 $this->session->userdata(); //获取全部user data

但是要注意:这几种数据是分割开来的,不能使用$this->session->userdata('item'),去访问一个设为flash data的数据:

1 $this->session->set_tempdata('item', 'value', 300);
2 $this->session->userdata('item'); //将会返回null
3  
4 $this->session->set_flashdata('item2', 'value');
5 $this->session->userdata('item2'); //将会返回null

Session数据的删除与销毁

session数据的删除可以理解为细粒度的删除某个session数据,可以使用:

1 $this->session->unset_userdata('item'); //删除user data
2 $this->session->unset_tempdata('item'); //删除temp data
3  
4 unset($_SESSION['item']); //对flash、temp、user三种data都有效,原生方法,推荐。

session销毁,则会使所有数据类型失效,包括flash data 和temp data:

1 session_destroy(); //原生,推荐
2 // 或者
3 $this->session->sess_destroy();

扩展内容:flash、temp及user data的设计思路

首先,三种类型的数据必定存在了$_SESSION超级变量中,也就是说使用set_tempdata()和set_flashdata()方法,都会把
对应的名称加入到$_SESSION超级变量中。不过这还没完,CI会用一个叫__ci_vars的session数据来区分flash
、temp与user data的不同。

1 $_SESSION['__ci_vars'] = array();

使用set_flashdata('item', 'value')时,除了$_SESSION['item'] = 'value'; 同时会有:

1 //还是首先会被保存到超级变量中
2 $_SESSION['item'] = 'value';
3 //然后保存到__ci_vars的session中
4 //  session值‘new’是CI自己定义的,没特殊含义,可以看成是flash data的标记
5 $_SESSION['__ci_vars']['item'] = 'new';

而使用set_tempdata('item2', 'value', 300)时,也是类似,不过略有区别:

1 //还是首先会被保存到超级变量中
2 $_SESSION['item2'] = 'value';
3 //然后保存到__ci_vars的session中
4 // 13789020340是当前时间戳加上300s, time() + 300;
5 //300来自于过期时间设置,可以在方法中传入
6 $_SESSION['__ci_vars']['item2'] = 13789020340;

当使用这些不同类型的数据时,CI首先看$_SESSION是否含有这个key,然后会根据$_SESSION['__ci_vars']数据包中key
对应的值来判断,简单地说,就是看对应的值是不是int类型。如果是,就认为是temp data;如果不是,则认为是flash
data。所以,你可以使用$_SESSION()方法获得所有类型的数据,也可以使用unset方法,删除掉所有类型的数据。

设置完flash data和temp data的下次请求时,构造函数都会判断$_SESSION['__ci_vars']中的特定数据,如果值为‘new’的,则置为‘old’;如果值是数字,则跟当前的时间戳比较,小于的话,则会删除该key下的数据。

再次请求时,flash data中置为‘old’的数据自动被删除,无法再次读取,temp data中的key已经过期删除,取值为NULL。

CodeIgniter 3之Session类库(2)(转)的更多相关文章

  1. CodeIgniter 3之Session类库(3)(转)

    本文主要讲CI2和CI3关于Session类库的区别.我们知道CI2的Session类使用了cookie来传递session数据.使用 cookie保存会话的好处在于可以节省服务器资源,但坏处也是显而 ...

  2. 优雅地使用CodeIgniter 3之Session类库(1)(转)

    相信无数人在使用CI2的Session类库时,遇到各种的坑,各种抱怨,各种不解.在CI中国论坛能搜到大量关于Session类库的提问,说明要想用 好session类库还是得下一番功夫.本文将先从CI2 ...

  3. CodeIgniter配置之SESSION

    刚使用Codeigniter时也被其中的SESSION迷惑过,后来就再也没用过CI自带的SESSION,想必还是有必要整理一下SESSION.为弄清CI中的SESSION,先来说一下PHP中SESSI ...

  4. CodeIgniter中的session处理

    在CI中你可以这样很简单地装载library:     $this->load->library('newclass');    注意系统中会有两个library目录,一个是system/ ...

  5. CodeIgniter类库之Benchmarking Class ,计算代码的执行时间

    CodeIgniter中有个Benchmarking类库,它是被系统自动被加载的,不需要手工加载.Benchmarking类库能够计算出任意两个被标记点之间的代码执行时间.通过这个数值,可以评估程序员 ...

  6. ***CodeIgniter集成微信支付(转)

    微信支付Native扫码支付模式二之CodeIgniter集成篇  http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...

  7. 微信支付JSAPI模式及退款CodeIgniter集成篇

    微信支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1 首先你得知道这个jsapi是不能离开微信进行调用支付的,明白 ...

  8. CI框架SESSION重写

    这个是我平时用的是 PHP 自己的 Session 机制,是真正的 PHP Session,存储在服务器端,而不是用的 cookie 接口完全兼容于 CI 2.0.x 的 Session 类库,也就是 ...

  9. CodeIgniter配置之config

    配置说明 $config['language']:指定项目语言包.需要注意的时Codeigniter自带的类库错误提示语言包位于/system/language/english/目录下,当这里配置非e ...

随机推荐

  1. IDEA开发spark本地运行

    1.建立spakTesk项目,建立scala对象Test 2.Tesk对象的代码如下 package sparkTest /** * Created by jiahong on 15-8-2. */ ...

  2. poj 3613(经过N条边的最短路)

    题目链接:http://poj.org/problem?id=3613 思路:我们知道如果矩阵A表示经过1条边的方案数,那么A^N矩阵就代表这经过N条边的方案数,而本题中要求经过N条边的最短距离,于是 ...

  3. ARM 汇编指令

    ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...

  4. Tencent 的电话面试

    Tencent的实习生招聘投了简历.然后,万万没想到昨晚腾讯IEG直接给我电话了.当时就惊呆了,我都没有找人内推,就直接电话面试了. 就为昨晚的电话面试写写感想吧!问的挺多的,基本上简历上写了的都问到 ...

  5. openvswitch 修改dpid(datapath id)

    版本: $ sudo ovs-vsctl -Vovs-vsctl (Open vSwitch) 2.0.2Compiled May 13 2015 18:49:53 $ sudo ovs-vsctl ...

  6. 李洪强iOS开发之OC[010] - 有参方法的声明实现和调用

    // //  main.m //  09 - 有参方法的声明实现和调用 // //  Created by vic fan on 16/7/5. //  Copyright © 2016年 李洪强. ...

  7. 关于java中split的使用

    之前在http://shukuiyan.iteye.com/blog/507915文中已经叙述过这个问题,但是最近一次笔试中居然有碰到了这个知识点,而且还做错了,囧!学艺不精啊.题目大概是这样的: ) ...

  8. ubuntu下搭建cocos2dx编程环境-下

         前两篇介绍了cocos2d-x 下linux开发环境配置和android 环境配置问题.在这其中遇到很多问题,所以最后一篇分享一下在处理这些问题时,我是如何解决的,是怎么想的.同时总结一些解 ...

  9. 使用RPM管理软件包

    一.概念简介 RPM 全名是『 RedHat Package Manager 』简称则为 RPM,是以一种数据库记录的方式来将你所需要的套件安装到你的 Linux 主机的一套管理程序. 二.实验环境 ...

  10. left join查询结果大于原始数据

    left join onon后面一定是一个主键或者是一个值为唯一的字段吗  on后面关联的条件如果是1对1的数量就不变,如果是1对多的数量就会增加 追问: 问题就在这,我1对多了 追答: 通常的做法是 ...