本文主要讲CI2和CI3关于Session类库的区别。我们知道CI2的Session类使用了cookie来传递session数据。使用 cookie保存会话的好处在于可以节省服务器资源,但坏处也是显而易见的:不能存储太多数据,同时由于暴露了一些重要元数据(ip地址、user agent、session id、user data、上次活动时间),也不够安全(虽然可以加密和自动更新)。当然它也可以使用数据库来保存session数据,但配置有一定的复杂度。

CI3的Session的类库则完全重新,也不再把元数据信息以cookie的方式发送到客户端,它采用了原生的Session来保存会话数据。同时也不 再是简单地通过配置使用数据库来存储Session数据,而是通过drivers驱动的模式自由切换到不同的Session Driver。CI默认使用的driver为files,所以使用$this->load->library('session')加载 Session类时,自动使用files的驱动。


CI2和CI3的Session配置区别

在CI2中的application/config/config.php中的session配置如下:

01 //即使$config['sess_encrypt_cookie']设为 FALSE,也需设置密钥。这是个小bug
02 $config['encryption_key'] = '_mahua_';
03  
04 $config['sess_cookie_name']  = 'ci_ssession';
05 $config['sess_expiration']  =  7200;
06 $config['sess_expire_on_close'] = TRUE;
07 $config['sess_encrypt_cookie'] = FALSE;
08 $config['sess_use_database'] = TRUE;
09 $config['sess_table_name']  = 'ci_sessions';
10 $config['sess_match_ip']  = FALSE;
11 $config['sess_match_useragent'] = FALSE;
12 $config['sess_time_to_update'] = 300;
13  
14 //同时会用到cookie的一些设置,因为它用cookie保存着session数据
15 $config['cookie_prefix'] = "";
16 $config['cookie_domain'] = "";
17 $config['cookie_path']  = "/";
18 $config['cookie_secure'] = FALSE;

而在CI3中,配置就简单了很多:

1 $config['sess_driver'] = 'files';
2 $config['sess_cookie_name'] = 'ci_session';
3 $config['sess_expiration'] = 7200;
4 $config['sess_save_path'] = NULL;
5 $config['sess_match_ip'] = FALSE;
6 $config['sess_time_to_update'] = 300;
7 $config['sess_regenerate_destroy'] = FALSE;

CI3中不再有$config['sess_match_useragent']配置,因为不再做此匹配。而配置$config['sess_expire_on_close'] 和$config['sess_encrypt_cookie'] 也不再存在:

01 //为保持兼容性和健壮性,sess_expire_on_close的配置依然有效,
02 //不过优先级非常低,等同于CI3的$config['sess_expiration'] = 0;
03 //CI3的seesion过期时间设置有三个层次,
04 //优先级最高:$this->load->library('session', array('driver'=>'files','cookie_lifetime'=>300));
05 //次优先级:配置文件中的配置节:$config['sess_expiration'] = 300;
06 //最低优先级:配置文件中的配置节:$config['sess_expire_on_close'] = TRUE;
07 $config['sess_expire_on_close'] = TRUE;
08  
09 //该配置不再有效,CI3的设置cookie时强制使用httponly,为了安全。
10 $config['sess_encrypt_cookie'] = FALSE;
11  
12 //该配置节依然有效,当session_driver配置节为空而该配置节为ture时,会使用database驱动器
13 $config['sess_use_database'] = TRUE;
14 //依然有效,等同于databse驱动器时的sess_save_path配置节
15 $config['sess_table_name']  = 'ci_sessions';
16  
17 //依然有效
18 $config['sess_match_ip']  = FALSE;
19 //无效
20 $config['sess_match_useragent'] = FALSE;
21 //依然有效。
22 $config['sess_time_to_update'] = 300;
23  
24 //新增配置节,会话重新生成时是否将以前的session文件内容删除掉。
25 //如果设为false并且驱动器设为files时,不断刷新含有session的页面,
26 //你会发现服务器上保存sessions的文件不断增多,不过不用担心,php的GC机制会帮你回收这些资源
27 $config['sess_regenerate_destroy'] = FALSE;

配置驱动器

首先的改动CI3.0支持更多的方式去存储session,包括files, database, redis, memcached以及自定义,$config['sess_driver'] 来配置驱动器,默认的驱动器是files。

1 //在配置文件中配置驱动器
2 $config['sess_driver'] = ‘files’;
3  
4 //或者使用加载器配置
5 $this->load->library('session', array('driver'=>'files', 'cookie_lifetime'=>300));

配置session save path

配置节sess_save_path会根据不同的驱动器,定义不同。

1.在files驱动器下,sess_save_path指的是session文件保存的路径。sess_save_path指定的文件夹目录需要是绝对路径,而且是可写的

1 //官方建议使用绝对路径,但经测试相对路径也是可行的。
2 //保持文件夹是可写的,保证拥有运行脚本的权限
3 //设为默认的NULL也是可行的,会使用php.ini里的配置,如:session.save_path = "c:/wamp/tmp"
4 $config['sess_save_path'] =  FCPATH.  'your/sess_save_path';

2. 在database情形下,sess_save_path指代的是保存session的数据表名,如:

1 $config['sess_driver'] = 'database';
2 $config['sess_save_path'] = 'ci_sessions';

3.在redis情形下,需要安装phpredis 的php扩展。sess_save_path指代的是主机和端口地址,如:

1 $config['sess_driver'] = 'redis';
2 $config['sess_save_path'] = 'tcp://localhost:6379';

4.在memcached情形下,也需要安装Memcached的php扩展,sess_save_path指代的也是主机和端口地址,如:

1 $config['sess_driver'] = 'memcached';
2 $config['sess_save_path'] = 'localhost:11211';

一个并发问题

随着web应用的发展,RIA越来越多,ajax请求会在客户端变得频繁。ajax请求是非阻塞的,这就意味着在同一时间会有两个持有相同Session
Id的请求达到服务器,并更改服务器上的Session 数据甚至重新产生新的session
id,这就会产生一个并发冲突。于是各种php的session
hanlder加入了锁机制,防止这种并发冲突。f当时用files驱动器时,锁机制是有效的,使用databse驱动器时,官方支持MySQL和
PostgreSQL数据库,因为它们有锁机制,其他数据库CI并不会支持。使用redis和Memcache
驱动器时,不具备锁机制,由CI模拟一种替代的锁。

在CI3以前的版本中,它的自动更新机制中,无论什么请求包括ajax,只要到达服务器就会更新session
id。到CI3时,已经加入了ajax请求的限制,如果是ajax请求,即使更新时间窗口到达,也不会更新session
id。这减少了并发冲突的可能性。但是锁机制的存在也会带来一些问题:

1 session_start();
2 $_SESSION["count"]=1;
3 //加入这句与不加这句的区别
4 session_write_close();
5 sleep(10);

不加session_write_close(),同时运行三个进程,执行时间分别是10秒,20秒和30秒。而加入
session_write_close()后,则三个进程同时进行,只需要10秒。原因在于执行session_start()后
对应的session文件是被锁定的,直到当前脚本结束才会解锁。在锁定期间,另一个进程访问相同session id
要等文件解锁后session_start()才会开始。 在 session 设置好数据后调用 session_write_close()
将数据写入文件并且结束session可释放session文件资源供其他进程使用。CI官方手册提示到:在 session 设置好数据后调用 session_write_close()是个非常良好的习惯。

文件驱动器还是数据库驱动器?

相信有很多人在纠结使用文件驱动器,还是数据库驱动器。如果你认为使用database驱动器的效率要大于files驱动器的话,你只对了一半。官方的建
议是:如果网站的session不多,使用database驱动器效率要高,但是随着用户量的上升,files驱动器反而优势明显,超过
database。当然如果真要追求效率,官方则推荐使用tmpfs,如果你愿意的话,radis和memcache也是不错的选择。在某种情形下,自己擅长的技术就是最好的技术。

关于CI3 Session类库的文章到此结束了,如果有什么不懂的地方,可以提出来大家一起研究讨论。为此我单独开了一个文章,好积累一些在CI中文论坛中常常问到的问题,仅作参考。

http://www.ifixedbug.com/posts/how-to-use-codeigniter3-session-3

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

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

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

  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. HDU 1393 Weird Clock (英语,纪念题)

    这题简单,只要看懂题目就好,坑爹的是我的英语水平太差了,wa了n次,所以 仅此纪念 一下. //坑爹的英语题目,注意重点:move d times clockwise the current time ...

  2. 机器学习(一):梯度下降、神经网络、BP神经网络

    这几天围绕论文A Neural Probability Language Model 看了一些周边资料,如神经网络.梯度下降算法,然后顺便又延伸温习了一下线性代数.概率论以及求导.总的来说,学到不少知 ...

  3. Simulate a seven-sided die using only five-sided

    问题描述: 如题 转述一下问题,就是说你现在有一个正五面体骰子,然后你怎么用这个正五面体骰子去模拟一个正七面体骰子. 这个问题我接触到几种方法,下面一一阐述. 方法一: rand7()=( rand5 ...

  4. iOS警告-Warning: Error creating LLDB target at path(模拟器警告)

    Warning: Error creating LLDB target at path '/Users/apple/Library/Developer/Xcode/DerivedData/Observ ...

  5. CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码

    CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码 CSS Animatie 彩蛋爆料直击现场 CSS Animatie是一款在线制作CSS3动画的工 ...

  6. 使用MbrFix.exe修复MBR分区表

    在卸载linux Ubuntu之前,先修复MBR,然后再删除Linux分区就可以了.而MbrFix.exe 就是这样一个Windows 修复MBR的应用程序软件,MbrFix.exe 不仅支持Wind ...

  7. Codeforces Round #263 (Div. 2) D. Appleman and Tree(树形DP)

    题目链接 D. Appleman and Tree time limit per test :2 seconds memory limit per test: 256 megabytes input ...

  8. 编程实现LINUX下目录的层层遍历

    /************************************************************************* > File Name: treedir.c ...

  9. SVN的使用(转载)

    MyEclipse中的SVN操作手册   导入项目 点击工具栏中的File-Import,进入下图: 点击Nex进入下图: 点击Next进入下图,输入你SVN服务器的IP地址,包括端口号和文件夹等完整 ...

  10. C++名字空间/C++命名空间

    0.序言 名字空间是C++提供的一种解决符号名字冲突的方法. 一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体. 通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间 ...