您好,欢迎访问一九零五行业门户网

实现基于Memcache存储的Session类

cache|session
我没事的时候写的自主实现session功能的类,基于文件方式存储session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习session是如何实现的。
使用基于文件的session存取瓶颈可能都是在磁盘io操作上,所以对付小数据量的session没有问题,但是如果碰到大数据量的sesstion,那么可能无法胜任,现在利用memcache来保存session数据,直接通过内存的方式,效率自然能够提高不少,并且如果结合php的memcache扩展,能够支持分布式的memcache服务器,那么这个性能就能够提到更高,负载更多更复杂的应用。
说明:以下代码基于memcache来保存session数据,客户端必须安装有php的memcache扩展,否则无法运行,同时本代码没有经过严格测试,只是作为学习代码。
'192.168.0.200', 'port'=>11211);
    var $memobject            = null;
/**
     * 构造函数
     *
     * @param bool $isinit - 是否实例化对象的时候启动session
     */
    function memcachesession($isinit = false){
        if ($isinit){
            $this->start();
        }
    }
    //-------------------------
    //   外部方法
    //-------------------------
/**
     * 启动session操作
     *
     * @param int $expiretime - session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
     */
    function start($expiretime = 0){
        $sessid = $_cookie[$this->cookiename];
        if (!$sessid){
            $this->sessid = $this->_getid();
            $this->cookieexpiretime = ($expiretime > 0) ? time() + $expiretime : 0;
            setcookie($this->cookiename, $this->sessid, $this->cookieexpiretime, /, '');
            $this->_initmemcacheobj();
            $_session = array();
            $this->_savesession();
        } else {
            $this->sessid = $sessid;
            $_session = $this->_getsession($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->_savesession();
        return true;
    }
/**
     * 销毁一个已注册的session变量
     *
     * @param string $varname - 需要销毁的session变量名
     * @return bool 销毁成功返回true
     */
    function unregister($varname){
        unset($_session[$varname]);
        $this->_savesession();
        return true;
    }
/**
     * 销毁所有已经注册的session变量
     *
     * @return 销毁成功返回true
     */
    function destroy(){
        $_session = array();
        $this->_savesession();
        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;
    }
    /**
     * 获取memcache的配置信息
     *
     * @return array memcache配置数组信息
     */
    function getmemconfig(){
        return $this->memconfig;
    }
/**
     * 设置memcache的配置信息
     *
     * @param string $host - memcache服务器的ip
     * @param int $port - memcache服务器的端口
     */
    function setmemconfig($host, $port){
        $this->memconfig = array('host'=>$host, 'port'=>$port);
    }
//-------------------------
    //   内部接口
    //-------------------------
/**
     * 生成一个session id
     *
     * @return string 返回一个32位的session id
     */
    function _getid(){
        return md5(uniqid(microtime()));
    }
/**
     * 获取一个保存在memcache的session key
     *
     * @param string $sessid - 是否指定session id
     * @return string 获取到的session key
     */
    function _getsesskey($sessid = ''){
        $sesskey = ($sessid == '') ? $this->sesskeyprefix.$this->sessid : $this->sesskeyprefix.$sessid;
        return $sesskey;
    }   
    /**
     * 检查保存session数据的路径是否存在
     *
     * @return bool 成功返回true
     */
    function _initmemcacheobj(){
        if (!class_exists('memcache') || !function_exists('memcache_connect')){
            $this->_showmessage('failed: memcache extension not install, please from http://pecl.php.net download and install');
        }       
        if ($this->memobject && is_object($this->memobject)){
            return true;
        }
        $mem = new memcache;
        if (!@$mem->connect($this->memconfig['host'], $this->memconfig['port'])){
            $this->_showmessage('failed: connect memcache host '. $this->memconfig['host'] .':'. $this->memconfig['port'] .' failed');
        }
        $this->memobject = $mem;
        return true;
    }
/**
     * 获取session文件中的数据
     *
     * @param string $sessid - 需要获取session数据的sessionid
     * @return unknown
     */
    function _getsession($sessid = ''){
        $this->_initmemcacheobj();
        $sesskey = $this->_getsesskey($sessid);
        $sessdata = $this->memobject->get($sesskey);
        if (!is_array($sessdata) || empty($sessdata)){
            $this->_showmessage('failed: session id '. $sesskey .' session data not exists');
        }
        return $sessdata;
    }
/**
     * 把当前的session数据保存到memcache
     *
     * @param string $sessid - session id
     * @return 成功返回true
     */
    function _savesession($sessid = ''){
        $this->_initmemcacheobj();
        $sesskey = $this->_getsesskey($sessid);
        if (empty($_session)){
            $ret = @$this->memobject->set($sesskey, $_session, false, $this->sessexpiretime);
        }else{
            $ret = @$this->memobject->replace($sesskey, $_session, false, $this->sessexpiretime);
        }
        if (!$ret){
            $this->_showmessage('failed: save sessiont data failed, please check memcache server');
        }
        return true;
    }
/**
     * 显示提示信息
     *
     * @param string $strmessage - 需要显示的信息内容
     * @param bool $isfailed - 是否是失败信息, 缺省是true
     */
    function _showmessage($strmessage, $isfailed = true){
        if ($isfailed){
            exit($strmessage);
        }
        echo $strmessage;
    }   
}
?>
其它类似信息

推荐信息