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

本文介绍了一个基于文件存储的自定义Session类,通过设置客户端Cookie来保存Session ID,并将用户数据存储在服务器端。该类适用于普通文件、共享内存或NFS服务器等存储方式。

 

实现基于文件存储的Session类

作者:heiyeluren
博客:
http://blog.csdn.net/heiyeshuwu

我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。

一般基于文件存储Session数据效率不是很高,毕竟跟磁盘IO是有关系的,如果需要多台服务器共享数据,可以考虑使用NFS来存储数据,如果需要比较快的速度,可以考虑使用共享内存(shm)来保存数据,直接把Session数据存储路径指定为/dev/shm,这样磁盘IO会提高不少,不过shm空间比较小,一般Linux下是60多M,所以不可能保存太多数据。

 

<? php
// =======================================
// 程序:File-Based Session Class
// 功能:基于文件存储的 Session 功能类
// 作者: heiyeluren
// 博客: http://blog.csdn.net/heiyeshuwu
// 时间: 2006-12-22
//=======================================



/* *
 * 类名: FileSession Class
 * 功能: 自主实现基于文件存储的 Session 功能
 * 描述: 这个类就是实现Session的功能, 基本上是通过设置客户端的Cookie来保存SessionID,
 *         然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的, 
 *         然后进行相应的数据操作, 目前的缺点是没有垃圾收集功能
 *
 *        本方式适合保存在普通文件、共享内存(SHM)、NFS服务器等基于文件存储的方式,推荐保存在共享 
 *        内存当中,因为共享内存存取效率比较高,但是空间比较小,重启后就销毁了
 
*/
class  FileSession
{
    
var   $sessId              =   '' ;
    
var   $sessSavePath       =   ' /tmp/ ' ;
    
var   $isCreatePath       =   true ;
    
var   $sessExpireTime   =   '' ;
    
var   $sessFilePrefix   =   ' sess_ ' ;
    
var   $cookieName       =   ' __SessHandler ' ;
    
    
/* *
     * 构造函数
     *
     * @param bool $isInit - 是否实例化对象的时候启动Session
     
*/
    
function  FileSession( $isInit   =   false ){
        
if  ( $isInit ){
            
$this -> start();
        }
    }

    
// -------------------------
    //   外部方法
    //-------------------------

    
    
/* *
     * 启动Session操作
     *
     * @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
     
*/
    
function  start( $expireTime   =   0 ){
        
$sessId   =   $_COOKIE [ $this -> cookieName];
        
if  ( ! $sessId ){
            
if  ( ! $this -> _checkSavePath()){
                
$this -> _showMessage( ' Session save path  ' .   $this -> sessSavePath  . '  not or create path failed ' );
            }
            
$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变量是否注册
     *
     * @param string $varName - 
     * @return bool 存在返回true, 不存在返回false
     
*/
    
function  is_registered( $varName ){
        
if  ( ! isset ( $_SESSION [ $varName ])){
            
return   false ;
        }
        
return   true ;
    }    
        
    
/* *
     * 注册一个Session变量
     *
     * @param string $varName - 需要注册成Session的变量名
     * @param mixed $varValue - 注册成Session变量的值
     * @return bool - 该变量名已经存在返回false, 注册成功返回true
     
*/
    
function  register( $varName ,   $varValue ){
        
if  ( isset ( $_SESSION [ $varName ])){
            
return   false ;
        }
        
$_SESSION [ $varName =   $varValue ;
        
$this -> _writeFile();
        
return   true ;
    }
    
    
/* *
     * 销毁一个已注册的Session变量
     *
     * @param string $varName - 需要销毁的Session变量名
     * @return bool 销毁成功返回true
     
*/
    
function  unregister( $varName ){
        
unset ( $_SESSION [ $varName ]);
        
$this -> _writeFile();
        
return   true ;
    }
    
    
/* *
     * 销毁所有已经注册的Session变量
     *
     * @return 销毁成功返回true
     
*/
    
function  destroy(){
        
$_SESSION   =   array ();
        
$this -> _writeFile();
        
return   true ;    
    }
    
    
/* *
     * 获取一个已注册的Session变量值
     *
     * @param string $varName - Session变量的名称
     * @return mixed - 不存在的变量返回false, 存在变量返回变量值
     
*/
    
function  get( $varName ){
        
if  ( ! isset ( $_SESSION [ $varName ])){
            
return   false ;
        }
        
return   $_SESSION [ $varName ];
    }    
    
    
/* *
     * 获取所有Session变量
     *
     * @return array - 返回所有已注册的Session变量值
     
*/
    
function  getAll(){
        
return   $_SESSION ;
    }
    
    
/* *
     * 获取当前的Session ID
     *
     * @return string 获取的SessionID
     
*/
    
function  getSid(){
        
return   $this -> sessId;
    }

    
/* *
     * 获取服务器端保存的Session数据的路径
     *
     * @return string 保存Session的路径
     
*/
    
function  getSavePath(){
        
return   $this -> sessSavePath;
    }
    
    
/* *
     * 设置保存Session数据的路径
     *
     * @param string $savePath - 需要保存Session数据的绝对路径
     
*/
    
function  setSavePath( $savePath ){
        
$this -> sessSavePath  =   $savePath ;
    }    
    
    
    
// -------------------------
    //   内部接口
    //-------------------------

    
    
/* *
     * 生成一个Session ID
     *
     * @return string 返回一个32位的Session ID
     
*/
    
function  _getId(){
        
return   md5 ( uniqid ( microtime ()));
    }
    
    
/* *
     * 检查保存Session数据的路径是否存在
     *
     * @return bool 成功返回true
     
*/
    
function  _checkSavePath(){
        
if  ( file_exists ( $this -> sessSavePath)){
            
return   true ;
        }
        
if  ( ! $this -> isCreatePath){
            
return   false ;
        }
        
if  ( ! @ mkdir ( $this -> sessSavePath)){
            
$this -> _showMessage( ' Failed: Session cache path  ' .   $this -> sessSavePath  . ' is not exists, create failed ' );
        }
        @
chmod ( $this -> sessSavePath ,   0777 );        
        
return   true ;
    }
    
    
/* *
     * 获取Session文件中的数据
     *
     * @param string $sessId - 需要获取Session数据的SessionId
     * @return unknown
     
*/
    
function  _getFile( $sessId   =   '' ){
        
$sessId   =  ( $sessId   ==   '' ?   $this -> sessId  :   $sessId ;
        
$sessFile   =   $this -> sessSavePath  .   $this -> sessFilePrefix  .   $sessId ;
        
if  ( ! file_exists ( $sessFile )){
            
$this -> _showMessage( ' Failed: Session file  ' .   $sessFile   . '  not exists ' );
        }
        
return   file_get_contents ( $sessFile );
    }
    
    
/* *
     * 把当前的Session数据写入到数据文件
     *
     * @param string $sessId - Session ID
     * @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: Open session save file  ' .   $sessFile   . '  failed ' );
        }
        
if  ( ! @ fwrite ( $fp ,   $sessStr )){
            
$this -> _showMessage( ' Failed: Write session data to  ' .   $sessFile   . '  failed ' );
        }
        @
fclose ( $fp );
        
return   true ;
    }
    
    
/* *
     * 显示提示信息
     *
     * @param string $strMessage - 需要显示的信息内容
     * @param bool $isFailed - 是否是失败信息, 缺省是true
     
*/
    
function  _showMessage( $strMessage ,   $isFailed   =   true ){
        
if  ( $isFailed ){
            
exit ( $strMessage );
        }
        
echo   $strMessage ;
    }    
}
?>

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值