首页 > 开发 > PHP > 正文

实现基于文件存储的Session类

2024-05-04 22:59:06
字体:
来源:转载
供稿:网友

我没事的时候写的自主实现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;
    }    
}
?>
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表