地址:http://blog.chinaunix.net/uid-11121450-id-3284875.html

这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡,

上面图上用户通过DNS的调度(一个域名对应多个ip)分别访问到VM2-VM5上,四台机器都访问VM1上的redis,两个redis值主从结构.
因此需要使用跨服务器的session保存用户登录状态,于是我写了一个跨站的session共享的类

点击(此处)折叠或打开

  1. <?php
  2. /*
  3. *用redis实现跨服务器session
  4. *注意需要安装phpredis模块
  5. *
  6. *作者:yifangyou
  7. *日期:2012-07-23 22:55:00
  8. **/
  9. class RedisSession{
  10. var $expire=86400;//过期时间
  11. var $sso_session;//session id
  12. var $session_folder;//session目录
  13. var $cookie_name;//cookie的名字
  14. var $redis;//redis连接
  15. var $cache;//缓存session
  16. var $expireAt;//过期时间
  17. /*
  18. *初始化
  19. *参数
  20. *$redis:php_redis的类实例
  21. *$cookie_name:cookie的名字
  22. *$session_id_prefix:sesion id的前缀
  23. **/
  24. function RedisSession($redis,$expire=86400,$cookie_name="sso_session",$session_id_prefix=""){
  25. $this->redis=$redis;
  26. $this->cookie_name=$cookie_name;
  27. $this->session_folder="sso_session:";
  28. //若是cookie已经存在则以它为session的id
  29. if(isset($_COOKIE[$this->cookie_name])){
  30. $this->sso_session=$_COOKIE[$this->cookie_name];
  31. }else{
  32. $this->expire=$expire;
  33. $this->expireAt=time()+$this->expire;
  34. //在IE6下的iframe无法获取到cookie,于是我使用了get方式传递了cookie的名字
  35. if(isset($_GET[$this->cookie_name])){
  36. $this->sso_session=$_GET[$this->cookie_name];
  37. }else{
  38. $this->sso_session=$this->session_folder.$session_prefix.md5(uniqid(rand(), true));
  39. }
  40. setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/");
  41. }
  42. }
  43. /*
  44. *设置过期时间
  45. *参数
  46. **/
  47. function expire($expire=86400){
  48. $this->expire=$expire;
  49. $this->expireAt=time()+$this->expire;
  50. //设置session过期时间
  51. setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/",".greatwallwine.com.cn");
  52. $this->redis->expireAt($this->sso_session, $this->expireAt);
  53. }
  54. /*
  55. *设置多个session的值
  56. *参数
  57. *$array:值
  58. **/
  59. function setMutil($array){
  60. $this->redis->hMset($this->sso_session,$array);
  61. }
  62. /*
  63. *设置session的值
  64. *参数
  65. *$key:session的key
  66. *$value:值
  67. **/
  68. function set($key,$value){
  69. $this->redis->hSet($this->sso_session,$key,$value);
  70. }
  71. /*
  72. *设置session的值为对象
  73. *参数
  74. *$key:session的key
  75. *$object:对象
  76. **/
  77. function setObject($key,$object){
  78. $this->redis->hSet($this->sso_session,$key,serialize($object));
  79. }
  80. /*
  81. *获取全部session的key和value
  82. @return: array
  83. **/
  84. function getAll(){
  85. return $this->redis->hGetAll($this->sso_session);
  86. }
  87. /*
  88. *获取一个session的key和value
  89. @return: array
  90. **/
  91. function get($key){
  92. return $this->redis->hGet($this->sso_session,$key);
  93. }
  94. /*
  95. *获取session的值为对象
  96. *参数
  97. *$key:session的key
  98. *$value:cookie的名字
  99. **/
  100. function getObject($key){
  101. return unserialize($this->redis->hGet($this->sso_session,$key));
  102. }
  103. /*
  104. *从缓存中获取一个session的key和value
  105. @return: array
  106. **/
  107. function getFromCache($key){
  108. if(!isset($this->cache)){
  109. $this->cache=$this->getAll();
  110. }
  111. return $this->cache[$key];
  112. }
  113. /*
  114. *删除一个session的key和value
  115. @return: array
  116. **/
  117. function del($key){
  118. return $this->redis->hDel($this->sso_session,$key);
  119. }
  120. /*
  121. *删除所有session的key和value
  122. @return: array
  123. **/
  124. function delAll(){
  125. return $this->redis->delete($this->sso_session);
  126. }
  127. }
  128. ?>

使用方法:

点击(此处)折叠或打开

  1. <?php
  2. error_reporting(0);
  3. $redisHost="192.168.1.2";
  4. $redisPort="6379";
  5. $redis = new Redis();
  6. $redis->connect($redisHost,$redisPort);
  7. include_once("inc/RedisSession.php");
  8. $redisSession=new RedisSession($redis);
  9. /*
  10. $redisSession->set("name","sdf4");
  11. $redisSession->set("age",1234);
  12. $redisSession->set("***","man14");
  13. $redisSession->set("name","abc4");
  14. $redisSession->setMutil(array("province"=>"guangdong","city"=>"guangzhou"));
  15. */
  16. $redisSession->setObject("obj",array("test1"=>array("test2")));
  17. $obj=$redisSession->getObject("obj");
  18. print_r($obj);
  19. die();
  20. print_r($redisSession->getAll());
  21. //$redisSession->del("name");
  22. print_r($redisSession->get("name"));
  23. //print_r($redisSession->get("province"));
  24. //$redisSession->delAll();
  25. //print_r($redisSession->getAll());
  26. print_r($redisSession->getFromCache("name"));
  27. /*
  28. $redisSession->del("name");
  29. $redisSession->delAll();
  30. */

比较常用的估计是set,get,setObject,getOject

我用sso_session:我主要是方便用phpRedisAdmin管理
 

[转载]用redis实现跨服务器session的更多相关文章

  1. 用redis实现跨服务器session(转)

    这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡, 上面图上用户通过DNS的调度(一个域名对应多个ip)分别访问到VM2-VM5上,四台机器都访问VM1上的redis,两 ...

  2. PHP实现跨服务器session共享的方法教程

    今天带来PHP实现跨服务器session共享的方法教程. 本文实例讲述了PHP实现cookie跨域session共享的方法.分享给大家供大家参考,具体如下: 做过web开发的小伙伴们都了解cookie ...

  3. php 跨域、跨子域,跨服务器读取session

    1.跨子域和跨服务器解决方式 Session主要分两部分:   一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在    另一个是标志着Session数据的Se ...

  4. 跨服务器的session共享

    四种 一.NFS(Net FileSystem): sun公司提供的,并发处理的效率不高,但操作方便 二.基于数据库的session共享 三.基于cookie的session共享 原理:将sessio ...

  5. PHP多台服务器跨域SESSION共享

    网站业务规模和访问量的逐步发展,原本由单台服务器.单个域名的迷你网站架构已经无法满足发展需要. 此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服 ...

  6. 跨服务器之间的session共享

    跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举4种较为可行的方案进行对比探讨: 1. 基于NFS的Session共享 NFS是Net FileSystem的简称 ...

  7. Redis安装及实现session共享

    一.Redis介绍 1.redis是key-value的存储系统,属于非关系型数据库 2.特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会 ...

  8. Using Redis to store php session

    Using Redis to store php session 默认情况下,php将会将session信息存储在文件系统上,在单机情况下没有问题,但是当系统负载增大,或者在对系统可用性要求很高的场景 ...

  9. PHP中Redis替代文件存储Session语句

    php默认使用文件存储session,如果并发量大,效率非常低.而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session. 这里,介绍下php的 session_set_s ...

随机推荐

  1. 轻量级状态管理库Pinia试吃

      最近连续看了几个GitHub上的开源项目,里面都用到了 Pinia 这个状态管理库,于是研究了一下,发现确实是个好东西!那么,Pinia 的特点: 轻量化 -- Pinia 体积约1KB,十分轻巧 ...

  2. 【spring 注解驱动开发】spring对象的生命周期

    尚学堂spring 注解驱动开发学习笔记之 - 生命周期 生命周期 1.生命周期-@Bean指定初始化和销毁方法 2.生命周期-InitializingBean和DisposableBean 3.生命 ...

  3. 【转】Linux tar命令详解

    参考:https://blog.csdn.net/kkw1992/article/details/80000653 linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包 ...

  4. 深入浅出Mybatis系列(六)---配置详解之typeAliases别名

    本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名. 例如: 我们在 ...

  5. 网络视频m3u8解密及ts文件合并

    网络视频m3u8解密及ts文件合并 参考了两篇博客: https://blog.csdn.net/weixin_41624645/article/details/95939510 https://bl ...

  6. C++笔记(11) 智能指针

    1. 设计思想 智能指针是行为类似于指针的类对象,但这种对象还有其他功能.首先,看下面的函数: void remodel(std::string & str) { std::string * ...

  7. VS在调试桌面程序时,cout到控制台方法

    参考博客:https://blog.csdn.net/xinxinsky/article/details/80733400 C++桌面程序设置 Properties -> Build Event ...

  8. 大天使之剑H5游戏超详细图文架设教程

    引言 想体验传奇游戏霸服的快乐吗?想体验满级VIP的尊贵吗?想体验一刀99999的爽快吗?各种极品装备装备.翅膀.宠物通通给你,就在大天使之剑! 本文讲解大天使之剑H5游戏的架设教程,想研究H5游戏如 ...

  9. 电子设备的使用方法-第5版(佳明智能腕表小米手机联想轻薄笔记本群晖存储)我的腾讯QQ电子邮箱地址是 595076941@qq.com - 2021年9月5日

      电子设备的使用方法-第5版   (佳明智能腕表小米手机联想轻薄笔记本群晖存储) 2021年9月5日 我的腾讯QQ电子邮箱地址是  595076941@qq.com 前言 大家好,我叫徐晓亮,今天我 ...

  10. 一、自动化监控利器-Zabbix

    目录 1. 监控的作用 1.1 为何需要监控系统 1.2 监控系统的实现 1.3 常用的监控软件 2. Zabbix简介 2.1 选择Zabbix的理由 2.2 Zabbix的功能特性 3. Zabb ...