实现基于Memcache存储的Session类
作者:heiyeluren
博客:http://blog.csdn.net/heiyeshuwu
我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。
使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少,并且如果结合PHP的Memcache扩展,能够支持分布式的Memcache服务器,那么这个性能就能够提到更高,负载更多更复杂的应用。
说明:以下代码基于Memcache来保存Session数据,客户端必须安装有PHP的Memcache扩展,否则无法运行,同时本代码没有经过严格测试,只是作为学习代码。
<?php
//===========================================
//程序:Memcache-BasedSessionClass
//功能:基于Memcache存储的Session功能类
//作者:heiyeluren
//博客:http://blog.csdn.net/heiyeshuwu
//时间:2006-12-23
//===========================================
/**
*类名:FileSessionClass
*功能:自主实现基于Memcache存储的Session功能
*描述:这个类就是实现Session的功能,基本上是通过设置客户端的Cookie来保存SessionID,
*然后把用户的数据保存在服务器端,最后通过Cookie中的SessionId来确定一个数据是否是用户的,
*然后进行相应的数据操作,目前的缺点是没有垃圾收集功能
*
*本方式适合Memcache内存方式存储Session数据的方式,同时如果构建分布式的Memcache服务器,
*能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
*注意:本类必须要求PHP安装了Memcache扩展,获取Memcache扩展请访问:http://pecl.php.net
*/
classMemcacheSession
{
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;
/**
*构造函数
*
*@parambool$isInit-是否实例化对象的时候启动Session
*/
functionMemcacheSession($isInit=false){
if($isInit){
$this->start();
}
}
//-------------------------
//外部方法
//-------------------------
/**
*启动Session操作
*
*@paramint$expireTime-Session失效时间,缺省是0,当浏览器关闭的时候失效,该值单位是秒
*/
functionstart($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变量是否注册
*
*@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->_saveSession();
returntrue;
}
/**
*销毁一个已注册的Session变量
*
*@paramstring$varName-需要销毁的Session变量名
*@returnbool销毁成功返回true
*/
functionunregister($varName){
unset($_SESSION[$varName]);
$this->_saveSession();
returntrue;
}
/**
*销毁所有已经注册的Session变量
*
*@return销毁成功返回true
*/
functiondestroy(){
$_SESSION=array();
$this->_saveSession();
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;
}
/**
*获取Memcache的配置信息
*
*@returnarrayMemcache配置数组信息
*/
functiongetMemConfig(){
return$this->memConfig;
}
/**
*设置Memcache的配置信息
*
*@paramstring$host-Memcache服务器的IP
*@paramint$port-Memcache服务器的端口
*/
functionsetMemConfig($host,$port){
$this->memConfig=array('host'=>$host,'port'=>$port);
}
//-------------------------
//内部接口
//-------------------------
/**
*生成一个SessionID
*
*@returnstring返回一个32位的SessionID
*/
function_getId(){
returnmd5(uniqid(microtime()));
}
/**
*获取一个保存在Memcache的SessionKey
*
*@paramstring$sessId-是否指定SessionID
*@returnstring获取到的SessionKey
*/
function_getSessKey($sessId=''){
$sessKey=($sessId=='')?$this->sessKeyPrefix.$this->sessId:$this->sessKeyPrefix.$sessId;
return$sessKey;
}
/**
*检查保存Session数据的路径是否存在
*
*@returnbool成功返回true
*/
function_initMemcacheObj(){
if(!class_exists('Memcache')||!function_exists('memcache_connect')){
$this->_showMessage('Failed:Memcacheextensionnotinstall,pleasefromhttp://pecl.php.netdownloadandinstall');
}
if($this->memObject&&is_object($this->memObject)){
returntrue;
}
$mem=newMemcache;
if(!@$mem->connect($this->memConfig['host'],$this->memConfig['port'])){
$this->_showMessage('Failed:Connectmemcachehost'.$this->memConfig['host'].':'.$this->memConfig['port'].'failed');
}
$this->memObject=$mem;
returntrue;
}
/**
*获取Session文件中的数据
*
*@paramstring$sessId-需要获取Session数据的SessionId
*@returnunknown
*/
function_getSession($sessId=''){
$this->_initMemcacheObj();
$sessKey=$this->_getSessKey($sessId);
$sessData=$this->memObject->get($sessKey);
if(!is_array($sessData)||empty($sessData)){
$this->_showMessage('Failed:SessionID'.$sessKey.'sessiondatanotexists');
}
return$sessData;
}
/**
*把当前的Session数据保存到Memcache
*
*@paramstring$sessId-SessionID
*@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:Savesessiontdatafailed,pleasecheckmemcacheserver');
}
returntrue;
}
/**
*显示提示信息
*
*@paramstring$strMessage-需要显示的信息内容
*@parambool$isFailed-是否是失败信息,缺省是true
*/
function_showMessage($strMessage,$isFailed=true){
if($isFailed){
exit($strMessage);
}
echo$strMessage;
}
}
?>
分享到:
相关推荐
标题中的“tomcat7 通过memcache 实现 session共享依赖包”指的是在Tomcat7服务器中,使用Memcache作为缓存系统来实现跨应用或跨服务器的session共享。这是一个技术解决方案,通常在分布式环境中,当有多个Tomcat...
- **性能优化**:由于memcache是基于内存的,内存大小限制了能存储的session数量。合理分配内存资源,以及及时清理过期session,可以避免内存耗尽。 - **安全性**:session中通常包含敏感信息,如用户ID和权限,...
Session是Web应用程序中用于跟踪用户状态的一种机制,它存储在服务器端,与传统的基于cookie的客户端存储方式相比,更安全且能存储大量数据。然而,当一个网站部署在多台服务器上时,单个服务器上的session无法在...
1. **Memcache**:它是一个开源的、基于内存的键值对存储系统,用来存储临时性的数据。由于其快速、轻量级的特性,特别适合用来缓存数据库查询结果或Web应用中的session数据。 2. **Session**:在Web开发中,session...
通过memcache实现tomcat7的session共享,目前生产环境用的不多了,但自己某个小需求用到,版本冲突好几次,分享给大家,这3个包复制到tomcat的 lib目录下 还有两个包需要 maven引入自己的项目中 <!-- memcache ...
标题中的“tomcat6 memcache session manager session共享 jar包下载”揭示了这个压缩包与Tomcat6服务器有关,特别地,它涉及到一个基于Memcache的Session管理器,用于实现跨多个应用服务器的Session共享。Session在...
tomcat kryo memcache session序列化 msm-memcached-session-manager-1.8.2
将Session数据存储在memcache中,可以让多台服务器通过网络访问同一个Session,实现Session共享。在PHP中,可以使用`memcached`扩展来操作memcache。例如,`SessionMemcache.php`文件可能包含了以下代码: ```php $...
使用memcache存储session数据时,需要注意数据的安全性。由于memcache不提供内置的加密功能,因此敏感的session数据(如用户密码)应先进行加密再存储。同时,确保memcache服务器只接受来自可信源的连接。 通过...
提供的jar包“memcache-session-manager”就是用来实现这一功能的。该组件允许Tomcat将session对象序列化并存储到Memcached服务器中,当需要时再从Memcached中读取。 具体实现步骤如下: 1. 安装和配置Memcached:...
描述提到的“基于memcache实现环形队列的方法”意味着这个PHP类是借助memcache这一内存对象缓存系统来存储和操作队列中的数据。memcache是一个广泛使用的分布式内存缓存系统,能够提高Web应用的性能,通过将数据存储...
2. 添加依赖:将"tomcat8_memcache_session共享jar"添加到Tomcat的类路径中,这通常是通过修改`$CATALINA_HOME/lib`目录下的库文件来完成的。 3. 配置Tomcat:在Tomcat的`context.xml`或`server.xml`配置文件中,...
- **Session共享**:Memcache是一个高性能的分布式内存对象缓存系统,用于存储临时数据,如Web应用的Session。通过在所有Tomcat实例间共享一个Memcache实例,可以确保用户在不同服务器间的会话状态一致性。 - **...
标题中的“Memcache Session Manager + Tomcat8.5.6”指的是在Tomcat 8.5.6版本中,利用Memcache作为会话管理器来实现跨服务器的session共享。Memcache是一个高性能、分布式内存对象缓存系统,常用于缓解数据库压力...
标题中的“基于php使用memcache存储session的详解”是指一种技术实践,即通过PHP语言将Web服务器上的用户session数据存储到memcache缓存系统中,以实现session数据的跨服务器共享,提高系统的可扩展性和性能。...
使用memcache存储session数据时,注意数据的加密和安全传输。虽然memcache本身不提供加密,但可以在应用程序层进行数据加密,防止敏感数据泄露。 6. **性能监控和优化**: 在实际运行中,需要定期检查memcache...
1、直接修改php.ini配置文件 复制代码 代码如下: session.save_handler = memcache //设置session的储存方式为memcache memcache.hash_strategy = “consistent”//设置memcache的hash算法 session.save_path = ...
标题 "Memcache Session Manager Tomcat8.5.6" 指的是在Tomcat 8.5.6版本中使用Memcache作为会话管理器的一种配置。这种配置旨在提高Web应用在集群环境下的性能和可扩展性,通过将用户的会话数据存储在分布式缓存...