热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CodeIgniter3之Session类库(3)(转)

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

本文主要讲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


推荐阅读
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
author-avatar
壮丁1987_536
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有