CI3的Session的重大改变就是默认使用了原生的Session,这符合Session类库本来的意思,似乎更加合理一些。总体来说,虽然设计理念不同,但为了保证向后兼容性,类库的使用方法与CI2.0的差别不是很大。一般的使用过程是这样的:
写数据
2 |
$this ->load->library( 'session' ); |
3 |
$this ->session->set_userdata( 'some_name' , 'some_value' ); //单个数据 |
5 |
'username' => 'johndoe' , |
6 |
'email' => 'johndoe@some-site.com' , |
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' ); |
需要换成:
1 |
$name = $this ->session->userdata( 'name' ); |
可以使用以下方法判断是否含有某个名称的session:
1 |
if ( $this ->session->has_userdata( 'some_name' )){ |
4 |
if (isset( $_SESSION [ 'some_name' ])){ |
删除数据
删除的话则和以前类似:
01 |
unset( $_SESSION [ 'some_name' ]); |
04 |
$_SESSION [ 'some_name' ], |
05 |
$_SESSION [ 'another_name' ] |
08 |
$this ->session->unset_userdata( 'some_name' ); |
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 |
05 |
$this ->session->mark_as_temp( array ( |
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' ]; //三种类型的数据都能得到 |
03 |
$this ->session->flashdata( 'item' ); // 获取flash data |
04 |
$this ->session->flashdata(); //获取全部flash data |
06 |
$this ->session->tempdata( 'item' ); //获取temp data |
07 |
$this ->session->tempdata(); //获取全部temp data |
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 |
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 |
4 |
unset( $_SESSION [ 'item' ]); //对flash、temp、user三种data都有效,原生方法,推荐。 |
session销毁,则会使所有数据类型失效,包括flash data 和temp data:
1 |
session_destroy(); //原生,推荐 |
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'; 同时会有:
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)时,也是类似,不过略有区别:
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类库(3)(转)
本文主要讲CI2和CI3关于Session类库的区别.我们知道CI2的Session类使用了cookie来传递session数据.使用 cookie保存会话的好处在于可以节省服务器资源,但坏处也是显而 ...
- 优雅地使用CodeIgniter 3之Session类库(1)(转)
相信无数人在使用CI2的Session类库时,遇到各种的坑,各种抱怨,各种不解.在CI中国论坛能搜到大量关于Session类库的提问,说明要想用 好session类库还是得下一番功夫.本文将先从CI2 ...
- CodeIgniter配置之SESSION
刚使用Codeigniter时也被其中的SESSION迷惑过,后来就再也没用过CI自带的SESSION,想必还是有必要整理一下SESSION.为弄清CI中的SESSION,先来说一下PHP中SESSI ...
- CodeIgniter中的session处理
在CI中你可以这样很简单地装载library: $this->load->library('newclass'); 注意系统中会有两个library目录,一个是system/ ...
- CodeIgniter类库之Benchmarking Class ,计算代码的执行时间
CodeIgniter中有个Benchmarking类库,它是被系统自动被加载的,不需要手工加载.Benchmarking类库能够计算出任意两个被标记点之间的代码执行时间.通过这个数值,可以评估程序员 ...
- ***CodeIgniter集成微信支付(转)
微信支付Native扫码支付模式二之CodeIgniter集成篇 http://www.cnblogs.com/24la/p/wxpay-native-qrcode-codeigniter.html ...
- 微信支付JSAPI模式及退款CodeIgniter集成篇
微信支付接口文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1 首先你得知道这个jsapi是不能离开微信进行调用支付的,明白 ...
- CI框架SESSION重写
这个是我平时用的是 PHP 自己的 Session 机制,是真正的 PHP Session,存储在服务器端,而不是用的 cookie 接口完全兼容于 CI 2.0.x 的 Session 类库,也就是 ...
- CodeIgniter配置之config
配置说明 $config['language']:指定项目语言包.需要注意的时Codeigniter自带的类库错误提示语言包位于/system/language/english/目录下,当这里配置非e ...
随机推荐
- codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
题目 给出一个n*m的01矩阵, 让你最多改变k个里面的值(0变1,1变0), 使得0.1的连通分量是矩阵.输出最少步数 1 ≤ n, m ≤ 100; 1 ≤ k ≤ 10 题解: 如果01连通分量 ...
- ZJU 1180 Self Numbers(暴力模拟判断,水题)
题目链接 同HDU 1128 , POJ 1316(这个范围小一点). 原本怕超时,以为有技巧或者规律,死命的想,后来发现这就是一道水体,模拟着全部判断一下就好了,10秒呢,完全不怕超时...唔,废话 ...
- eq相等 ,ne、neq不相等 EL表达式
eq相等,ne.neq不相等, gt大于, lt小于 gte.ge大于等于 lte.le 小于等于 not非 mod求模 is [not] div by是否能被某数整除 is [n ...
- yarn介绍
hadoop 1.0 mapreduce过程 主要问题: JobTracker 是 Map-reduce 的集中处理点,存在单点故障. JobTracker 完成了太多的任务,造成了过多的资源消耗,当 ...
- mq_notify
NAME mq_notify - 通知进程可以接收一条消息 (REALTIME) SYNOPSIS #include <mqueue.h> int mq_notify(mqd_t mqde ...
- getElementByClassName封装函数用法
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- uchome 积分体系
一.总体流程 1):管理员在后台修改积分规则2):数据被写入数据表creditrule 中,并将数据写入缓存文件data/data_creditrule.php 中3):用户发表文章或者进行其他操作的 ...
- C++:获取数组长度
C/C++中如何获取数组的长度? 如何获取数组的长度 2010-12-15 20:49 C/C++中如何获取数组的长度? 收藏 C.C++中没有提供 直接获取数组长度的函数,对于存放字符串 ...
- jboss内存管理
jboss内存查看 1. 用浏览器打开网址:http://IP:port/jmx-console/ 2. 找到 jboss.system 一节,或者在 filter 文本框中输入 jboss.syst ...
- 大型web系统架构详解
(如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 动态应用,是相对于网站静态内 ...