`
varsoft
  • 浏览: 2438450 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[原创]实现基于文件存储的Session类

阅读更多

实现基于文件存储的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;
}
}
?>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics