本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7568143
建立时间:2006年5月29日




[Cache]实现基于Memcache存储的Session类
软件技术

lhwork 发表于 2006/12/27 15:24:43

作者:heiyeluren博客:http://blog.csdn.net/heiyeshuwu我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。使 用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那 么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少,并且如果结合PHP的Memcache 扩展,能够支持分布式的Memcache服务器,那么这个性能就能够提到更高,负载更多更复杂的应用。说明:以下代码基于Memcache来保存Session数据,客户端必须安装有PHP的Memcache扩展,否则无法运行,同时本代码没有经过严格测试,只是作为学习代码。<?php//===========================================// 程序:Memcache-Based Session Class// 功能:基于Memcache存储的 Session 功能类// 作者: heiyeluren// 博客: http://blog.csdn.net/heiyeshuwu// 时间: 2006-12-23//===========================================/** * 类名: FileSession Class * 功能: 自主实现基于Memcache存储的 Session 功能 * 描述: 这个类就是实现Session的功能, 基本上是通过设置客户端的Cookie来保存SessionID, *         然后把用户的数据保存在服务器端,最后通过Cookie中的Session Id来确定一个数据是否是用户的,  *         然后进行相应的数据操作, 目前的缺点是没有垃圾收集功能 * *        本方式适合Memcache内存方式存储Session数据的方式,同时如果构建分布式的Memcache服务器, *        能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况 * 注意: 本类必须要求PHP安装了Memcache扩展, 获取Memcache扩展请访问: http://pecl.php.net */class MemcacheSession{    var $sessId                = '';    var $sessKeyPrefix         = 'sess_';    var $sessExpireTime        = 86400;    var $cookieName         = '__SessHandler';    var $cookieExpireTime     = '';        var $memConfig             = array('host'=>'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;    }    }?>


阅读全文(3764) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.078 second(s), page refreshed 144755722 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号