`
zhengdl126
  • 浏览: 2538520 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

关于session和memcache的若干问题

阅读更多

========================================================php.ini session memcache

实现Session的功能,基本上是通过
 *          设置客户端的Cookie来保存SessionID,
 *          然后把用户的数据保存在服务器端,最后通

 *          Cookie中的Session Id来确定一个数据是否是用户的,


原始
session.save_handler = files


mem:

session.save_handler = memcache

session.save_path = "tcp://192.168.0.26:13001,tcp://192.168.0.26:13002"

session.use_cookies = 1

 


//memcache 配置数组
$memcache_servers=array(
      array("host"=>"192.168.0.26",
            "port"=>"14001",
            "persistent"=>true,
            "weight"=>1,
            "timeout"=>1,//1为默认值,单位为秒
            "retry_interval"=>2,
            "status"=>true,
            "failure_callback"=>"memcacheConnectLog"
      ),
      array("host"=>"192.168.0.26",
            "port"=>"14002",
            "persistent"=>true,
            "weight"=>1,
            "timeout"=>1,//1为默认值,单位为秒
            "retry_interval"=>2,
            "status"=>true,
            "failure_callback"=>"memcacheConnectLog" //写入日志函数
      )
);

 

 

 

一直以来,由于php本身的session机制不能跨机,令很多phper感到不爽,现在流行的解决方案主要有:
1)使用数据库来实现
2)自己写server端,通过改写session处理函数来请求
3)使用nfs等跨机存储来保存session
4)使用memcache来保存
5)使用zend platform提供的解决方案

其中的1-4都是通过改用可以跨机的储存机制,再使用session_set_save_handler()来实现,5是zend公司的商业产品(不过据之前在使用的同事反映,效果不太满意),以上的方案,各有利弊,不在本文讨论范围

无论是用memcache,还是db,nfs,其原理是一样的,都是通过session_set_save_handler函数来改变默认的处理方式,通过指定回调函数来自定义处理,可以参考手册的session_set_save_handler()函数部分,有例子,比较容易明白

以下是一些我在使用memcache来实现时的一些记录:
1)使用类来实现时,各回调函数都定义为静态方法,在类的构造中使用session_set_save_handler注册回调函数, 如:
session_set_save_handler(
                array('memSession', 'open'),
                array('memSession', 'close'),
                array('memSession', 'read'),
                array('memSession', 'write'),
                array('memSession', 'destroy'),
                array('memSession', 'gc')
          );
memSession为类名,要使用session,则先new memSession,再session_start();


2)生存期和垃圾回收
memCache的set命令有生存期,即使用set命令添加值时,可加上lifetime,此时间可以作为session的生存期,用户在此时间内没有动作,则会失效,但有动作则不会失效(因为每一个脚本结束时,都会执行write和close,此时lifetime就会被更新了),当然,如果使用 cookie传递SID,则控制SESSION生存期可以用:ini_set('session.cookie_lifetime',time)来设定, 这其实是控制cookie的有效时间,如果session赖以生存的cookie消失了,当然session也就活不了,使用 cookie_lifetime来控制的话,无论有无动作,都将在指定的时间后过时

gc是指垃圾回收,在session中是指清理过期的session数据,影响的参数有:
session.gc_maxlifetime 被视为垃圾前的生存期,超过此时间没有动作,数据会被清走
注意的是,gc不是每次启动会话都会被执行,而是由session.gc_probability 和 session.gc_divisor的比率决定的

结论:控制SESSION的生存期有几种方法
一是cookie_lifttime,这种方式无论有无动作,都会在指定时间内销毁
二是在read中根椐保存时间控制,此方法在有动作时时间会一直有效
三设定session.gc_probability 和 session.gc_divisor的比率为1(即每次会话都会启用gc),再设定gc.maxlifetime来指定生存期,此方法也是在用户有动作时时间一直有效

3)回调函数的执行时机
open 在运行session_start()时执行
read 在运行session_start()时执行,因为在session_start时,会去read当前session数据并写入$_SESSION变量
destroy 在运行session_destroy()时执行
close 在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完成后被执行
gc 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,即session_start会相继执行open,read和gc
write 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行

结论:
session_start //执行open(启动会话),read(读取session数据至$_SESSION),gc(清理垃圾)
脚本中间所有对$_SESSION的操作均不会调用这些回调函数
session_destroy //执行destroy,销毁当前session(一般是删除相应的记录或文件),相应地,此回调函数销毁的只是session的数据,但此时

var_dump一下$_SESSION变量,仍然有值的,但此值不会在close后被write回去
session_write_close() //执行write和close,保存$_SESSION至存储,如不手工使用此方法,则会在脚本结束时被自动执行

清晰了以上信息,将对你清楚了解SESSION的工作原理有很大的帮助...

4)直接使用memcache作session处理
在我写了一系列的memcache来保存session的代码后,无意中发现,可以直接在php.ini中设定使用memcache作为session处理,而无须另外编码,方法是:
修改php.ini中的以下值
session.save_handler = memcache
session.save_path = 'tcp://host1:11211' #有多个时直接用","分隔即可
如果只想在特定的应用里使用memcache储存session,可以使用ini_set的方法对以上两个参数进行设定

要测试一下是否真正用上了memcache,可以先捕足到使用的PHPSESSID,再作为KEY用memcach去读一下,就清楚了

分享到:
评论

相关推荐

    tomcat7集群session共享memcache依赖包1.8.3

    总的来说,"tomcat7集群session共享memcache依赖包1.8.3"提供了一种有效的方法,解决了在Tomcat7集群中Session共享的问题,通过Memcached作为中间件,实现了跨节点的Session一致性,提高了系统的可用性和用户体验。...

    PHP实现多服务器session共享之memcache共享.rar

    memcache提供了CAS(Compare and Swap)机制,可以在读取和更新session时避免数据冲突。 5. **优化与扩展**:根据需求,可能需要考虑session数据的序列化和反序列化策略,以及在服务器扩展时的负载均衡和故障恢复...

    集群环境下memcache解决session共享

    为了解决这个问题,我们可以引入外部存储系统,如memcache,来实现session的集中存储和共享。Memcache是一款高性能、分布式的内存对象缓存系统,它可以将数据存储在内存中,以提供快速的数据访问。在Tomcat8中,我们...

    tomcat6 memcache session manager session共享 jar包下载

    描述中提到,“用于tomcat6 使用memcache 实现session共享的jar包”,这表明这些jar文件是为Tomcat6设计的插件或库,目的是通过Memcache这个内存缓存系统来存储和管理Session数据。Memcache是一个高性能、分布式的...

    session共享之memcache Redis

    标题中的“session共享之memcache Redis”指的是在Web开发中如何使用memcache和Redis来实现会话(session)数据的跨服务器共享。会话管理是Web应用中的关键部分,它允许用户在不同页面间保持状态,例如登录信息、...

    session共享 tomcat+nginx+memcache

    在构建分布式系统时,Session共享是一个关键问题,特别是在使用多台服务器(如Tomcat)和负载均衡器(如Nginx)的环境中。本压缩包提供的资源是为了解决这个问题,通过集成Memcached来实现Session的集中式管理,从而...

    memcache共享session用到的jar

    这个压缩包"memcache共享session用到的jar"包含的是已经经过测试,兼容的Memcache客户端库和其他可能需要的依赖。使用这个包可以避免因版本不兼容导致的问题,直接集成到项目中即可开始使用Memcache进行session共享...

    tomcat7 通过memcache 实现 session共享依赖包

    3. **memcached-session-manager-2.0.0.jar**:这是Memcached Session Manager的核心库,它负责处理session的存储、恢复和过期策略,使得Tomcat能够将session数据透明地存储在Memcache中。 4. **kryo-serializers-...

    memcache-session序列化

    tomcat kryo memcache session序列化 msm-memcached-session-manager-1.8.2

    Nginx+tomcat6+memcache配置集群session共享所需jar包

    这里我们关注的是如何通过Nginx、Tomcat6和Memcached实现集群中的session共享。这个压缩包“Nginx+tomcat6+memcache所需jar包”提供了实现这一目标所需的组件。 首先,Nginx是一个高性能的反向代理服务器,常用于...

    tomcat7通过memcache 实现 session共享

    通过memcache实现tomcat7的session共享,目前生产环境用的不多了,但自己某个小需求用到,版本冲突好几次,分享给大家,这3个包复制到tomcat的 lib目录下 还有两个包需要 maven引入自己的项目中 <!-- memcache ...

    Memcache Session Manager Tomcat8.5.6

    标题 "Memcache Session Manager Tomcat8.5.6" 指的是在Tomcat 8.5.6版本中使用Memcache作为会话管理器的一种配置。这种配置旨在提高Web应用在集群环境下的性能和可扩展性,通过将用户的会话数据存储在分布式缓存...

    PHP 实现多服务器session共享之memcache共享

    总结,通过memcache实现PHP的多服务器session共享,可以有效解决分布式系统中的用户状态同步问题,提高系统的可扩展性和稳定性。然而,这也需要开发者对memcache、PHP配置以及网络通信有深入的理解,以便在实际应用...

    Memcache Session Manager + Tomcat8.5.6

    总结起来,这个架构结合了Nginx的负载均衡、Tomcat的Web应用处理、Memcache的高效缓存和Kryo的序列化技术,实现了高可用、高性能的Web服务,同时解决了session共享的问题。在实际部署时,还需要根据具体需求进行优化...

    asp memcache 解决缓存问题

    通过以上步骤,ASP Memcache 可以显著提升网站或应用程序的响应速度,尤其在需要处理大量用户session和频繁数据库操作的情况下。然而,要注意的是,Memcache 不适合存储持久化数据,因为一旦服务重启,所有缓存数据...

    tomcat整合nginx负载均衡+memcache共享session全部程序包

    在构建高性能、高可用性的...总之,这个“tomcat7+nginx+memcached”程序包提供了一种高效、可靠的Web应用架构,通过Nginx实现负载均衡,借助Memcache实现跨服务器的Session共享,极大地提升了系统的可用性和扩展性。

    PHP保存session到memcache服务器的方法

    本文实例讲述了PHP保存session到memcache服务器的方法。分享给大家供大家参考,具体如下: 传统的 session 是写入到服务器文件中,可以在 php.ini 中看出,清单如下 ...将 session 保存到 memcache

    在php中设置session用memcache来存储的方法总结

    memcached提供了一个自定义的session处理器可以被用于存储用户session数据到memcached服务端,下面通过本文给大家介绍在php中设置session用memcache来存储的方法总结,对php session memcache相关知识感兴趣的朋友...

    Zend Framework实现将session存储在memcache中的方法

    主要介绍了Zend Framework实现将session存储在memcache中的方法,结合实例形式分析了Zend Framework框架下将session存储在memcache的实现技巧,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics