实现基于文件存储的Session类
作者:heiyeluren
博客:http://blog.csdn.net/heiyeshuwu
我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。
一般基于文件存储Session数据效率不是很高,毕竟跟磁盘IO是有关系的,如果需要多台服务器共享数据,可以考虑使用NFS来存储数据,如果需要比较快的速度,可以考虑使用共享内存(shm)来保存数据,直接把Session数据存储路径指定为/dev/shm,这样磁盘IO会提高不少,不过shm空间比较小,一般Linux下是60多M,所以不可能保存太多数据。
<?php
//=======================================
//程序:File-BasedSessionClass
//功能:基于文件存储的Session功能类
//作者:heiyeluren
//博客:http://blog.csdn.net/heiyeshuwu
//时间:2006-12-22
//=======================================
/**
*类名:FileSessionClass
*功能:自主实现基于文件存储的Session功能
*描述:这个类就是实现Session的功能,基本上是通过设置客户端的Cookie来保存SessionID,
*然后把用户的数据保存在服务器端,最后通过Cookie中的SessionId来确定一个数据是否是用户的,
*然后进行相应的数据操作,目前的缺点是没有垃圾收集功能
*
*本方式适合保存在普通文件、共享内存(SHM)、NFS服务器等基于文件存储的方式,推荐保存在共享
*内存当中,因为共享内存存取效率比较高,但是空间比较小,重启后就销毁了
*/
classFileSession
{
var$sessId='';
var$sessSavePath='/tmp/';
var$isCreatePath=true;
var$sessExpireTime='';
var$sessFilePrefix='sess_';
var$cookieName='__SessHandler';
/**
*构造函数
*
*@parambool$isInit-是否实例化对象的时候启动Session
*/
functionFileSession($isInit=false){
if($isInit){
$this->start();
}
}
//-------------------------
//外部方法
//-------------------------
/**
*启动Session操作
*
*@paramint$expireTime-Session失效时间,缺省是0,当浏览器关闭的时候失效,该值单位是秒
*/
functionstart($expireTime=0){
$sessId=$_COOKIE[$this->cookieName];
if(!$sessId){
if(!$this->_checkSavePath()){
$this->_showMessage('Sessionsavepath'.$this->sessSavePath.'notorcreatepathfailed');
}
$this->sessId=$this->_getId();
$this->sessExpireTime=($expireTime>0)?time()+$expireTime:0;
setcookie($this->cookieName,$this->sessId,$this->sessExpireTime,"/",'');
$_SESSION=array();
$this->_writeFile();
}else{
$this->sessId=$sessId;
$_SESSION=unserialize($this->_getFile($sessId));
}
}
/**
*判断某个Session变量是否注册
*
*@paramstring$varName-
*@returnbool存在返回true,不存在返回false
*/
functionis_registered($varName){
if(!isset($_SESSION[$varName])){
returnfalse;
}
returntrue;
}
/**
*注册一个Session变量
*
*@paramstring$varName-需要注册成Session的变量名
*@parammixed$varValue-注册成Session变量的值
*@returnbool-该变量名已经存在返回false,注册成功返回true
*/
functionregister($varName,$varValue){
if(isset($_SESSION[$varName])){
returnfalse;
}
$_SESSION[$varName]=$varValue;
$this->_writeFile();
returntrue;
}
/**
*销毁一个已注册的Session变量
*
*@paramstring$varName-需要销毁的Session变量名
*@returnbool销毁成功返回true
*/
functionunregister($varName){
unset($_SESSION[$varName]);
$this->_writeFile();
returntrue;
}
/**
*销毁所有已经注册的Session变量
*
*@return销毁成功返回true
*/
functiondestroy(){
$_SESSION=array();
$this->_writeFile();
returntrue;
}
/**
*获取一个已注册的Session变量值
*
*@paramstring$varName-Session变量的名称
*@returnmixed-不存在的变量返回false,存在变量返回变量值
*/
functionget($varName){
if(!isset($_SESSION[$varName])){
returnfalse;
}
return$_SESSION[$varName];
}
/**
*获取所有Session变量
*
*@returnarray-返回所有已注册的Session变量值
*/
functiongetAll(){
return$_SESSION;
}
/**
*获取当前的SessionID
*
*@returnstring获取的SessionID
*/
functiongetSid(){
return$this->sessId;
}
/**
*获取服务器端保存的Session数据的路径
*
*@returnstring保存Session的路径
*/
functiongetSavePath(){
return$this->sessSavePath;
}
/**
*设置保存Session数据的路径
*
*@paramstring$savePath-需要保存Session数据的绝对路径
*/
functionsetSavePath($savePath){
$this->sessSavePath=$savePath;
}
//-------------------------
//内部接口
//-------------------------
/**
*生成一个SessionID
*
*@returnstring返回一个32位的SessionID
*/
function_getId(){
returnmd5(uniqid(microtime()));
}
/**
*检查保存Session数据的路径是否存在
*
*@returnbool成功返回true
*/
function_checkSavePath(){
if(file_exists($this->sessSavePath)){
returntrue;
}
if(!$this->isCreatePath){
returnfalse;
}
if(!@mkdir($this->sessSavePath)){
$this->_showMessage('Failed:Sessioncachepath'.$this->sessSavePath.'isnotexists,createfailed');
}
@chmod($this->sessSavePath,0777);
returntrue;
}
/**
*获取Session文件中的数据
*
*@paramstring$sessId-需要获取Session数据的SessionId
*@returnunknown
*/
function_getFile($sessId=''){
$sessId=($sessId=='')?$this->sessId:$sessId;
$sessFile=$this->sessSavePath.$this->sessFilePrefix.$sessId;
if(!file_exists($sessFile)){
$this->_showMessage('Failed:Sessionfile'.$sessFile.'notexists');
}
returnfile_get_contents($sessFile);
}
/**
*把当前的Session数据写入到数据文件
*
*@paramstring$sessId-SessionID
*@return成功返回true
*/
function_writeFile($sessId=''){
$sessId=($sessId=='')?$this->sessId:$sessId;
$sessFile=$this->sessSavePath.$this->sessFilePrefix.$sessId;
$sessStr=serialize($_SESSION);
if(!$fp=@fopen($sessFile,"w+")){
$this->_showMessage('Failed:Opensessionsavefile'.$sessFile.'failed');
}
if(!@fwrite($fp,$sessStr)){
$this->_showMessage('Failed:Writesessiondatato'.$sessFile.'failed');
}
@fclose($fp);
returntrue;
}
/**
*显示提示信息
*
*@paramstring$strMessage-需要显示的信息内容
*@parambool$isFailed-是否是失败信息,缺省是true
*/
function_showMessage($strMessage,$isFailed=true){
if($isFailed){
exit($strMessage);
}
echo$strMessage;
}
}
?>
分享到:
相关推荐
如果没有sessionId就新创建session,如果有sessionId,就去redis中查看是否有此id的记录,如果没有就新建session,如果有,还是新建session,并把redis中此session的相关数据赋值给新建的session,最后保存sessionId...
基于Hadoop实现的文件存储系统 技术点redis:利用redisson来对上传文件进行布隆过滤(已上传的文件无需再次上传);进行session会话管理;HDFSAPI操作(项目功能):创建文件夹,上传文件,下载文件,删除文件,查找...
今天用了一天来搞定了ssm+redis集成和nginx实现负载均衡,这里只有ssm+redis简单d集成demo,希望大家一起来讨论
基于redis实现的分布式session控制,多站点 多服务器均可兼容,使用方法:本地启动redis并配置到webconfig中
tomcat基于redis实现session共享所依赖的jar包
session驱动类 session存入数据库 数据库存储session 用于session存入数据库
PHP+MYSQL+SESSION实现简单购物车类完美DEMO数据库文件
基于Session的在线用户统计实现 基于Session的在线用户统计实现
但是该套实现,代码质量非常差(10几个java文件,都快吓晕),并且redis的连接没有基于spring,而是在java代码中硬编码,这几乎无法容忍。 为此,本人基于spring连接redis,吸取了他们文章的思想,重新写了一套解决...
用Session实现用户的登陆,界面的购物存储,显示
一个完整的 Session 类,整合了 Session 最基本的属性值,其中,打开,关闭与清理是符合php编程规范的,这也是一个很好的...小小的说明一下,如果网站不是大量使用 Session 类,基本上就没必要使用 SESSION 类了。
NULL 博文链接:https://jacktan.iteye.com/blog/875121
Redisson通过重定义Session相关类方法的方式实现Session到Redis的存储,一般无需修改现有程序中的Session相关操作代码,即可实现使用Redis共享存储多个Tomcat的Session,程序改造成本较小。具体信息详见本资源中的...
session跨服务器跨域解决方案 基于memcahe的session方法重写
项目采用Spring、SpringMVC技术、具体实现的功能为基于Cookie技术的Session跨域功能
为了使web应用能使用saas模式的大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一, tomcat等多数服务都采用了session复制技术实现session的共享
基于springMVC拦截session中的某个值,一般情况下用于拦截session中用户信息是否存在
spring session实现session共享
PHP session跨服务器跨域解决方案 基于memcahe的session方法重写
主要为大家详细介绍了Springboot实现多服务器session共享,具有一定的参考价值,感兴趣的小伙伴们可以参考一下