菜单

discuz中session机制分析小结

2015 年 4 月 7 日 - 技术类

 

 

在Discuz! X中SESSION 并没有使用 PHP 自带的 SESSION 机制,而是使用mysql内存表存储的机制,这是考虑到解决分布式论坛时多点登录的session共享问题的设计。

在数据库中可以看到有两个 SESSION 表:
一个是pre_common_adminsession,是管理员登录后台的 SESSION 表;
另一个是 pre_common_session 表,是所有用户在前台浏览页面时的SESSION 表。
这两个表都是内存表(内存表的读写速度远高于 MYISAM 表及文本文件)。

在 Discuz! X 中 SESSION 与 COOKIE 是分不开的,因为 SESSION 就是从客户端读取的 COOKIE ,
然后由浏览页面时触发相关的函数执行,再写入数据库 SESSION 表。

值得注意的是无论是游客访问还是登陆的会员访问,都会产生和更新sesssion,哪怕你访问的是缓存出来的静态页面数据,只要经过Discuz! X的核心调用,就会执行。这也是Discuz! X在静态缓存的页面高压访问时也会负载飙高的原因。可能是Discuz! X也对这个问题上感到不妥,所以在config中加入了防DD攻击的选项,其核心也是根据SESSION的IP来判别短时间大量访问的用户地址并加以阻止直接访问。在开放性的论坛并游客访问巨大造成的负载时,应该考虑重写SESSION机制以redis或memcache代替mysql的内存表存储。

Center

这里值得注意的是,当用户退出的时候,会执行一个叫clearcookie的方法,这个方法是把用户的所有COOKIE清空,而SID是存在COOKIE里的,这时候要是清空了COOKIE则SID的值就会被改变了。为了保持当前这个用户的SID(不管登录、还是退出,SID的值都一样,模拟会话的基本原理),DX用了一个小技巧,即在退出的时候,调用了showmessage方法。showmessage方法是DX通用的提示跳转方法,调用这个方法会给用户一个很好的提示页面。但是在这个页面里,他会加载footer.htm模板,这个模板里执行了updatesession方法,而这个方法里会把SID再重新种到COOKIE里

清除SID的COOKIE  –> 调用showmessage –> 调用updatesession –>重新种上SID的COOKIE

这时SID就能从头到尾保持不变了。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注