[转载]用redis实现跨服务器session
地址:http://blog.chinaunix.net/uid-11121450-id-3284875.html
这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡,
点击(此处)折叠或打开
- <?php
- /*
- *用redis实现跨服务器session
- *注意需要安装phpredis模块
- *
- *作者:yifangyou
- *日期:2012-07-23 22:55:00
- **/
- class RedisSession{
- var $expire=86400;//过期时间
- var $sso_session;//session id
- var $session_folder;//session目录
- var $cookie_name;//cookie的名字
- var $redis;//redis连接
- var $cache;//缓存session
- var $expireAt;//过期时间
- /*
- *初始化
- *参数
- *$redis:php_redis的类实例
- *$cookie_name:cookie的名字
- *$session_id_prefix:sesion id的前缀
- **/
- function RedisSession($redis,$expire=86400,$cookie_name="sso_session",$session_id_prefix=""){
- $this->redis=$redis;
- $this->cookie_name=$cookie_name;
- $this->session_folder="sso_session:";
- //若是cookie已经存在则以它为session的id
- if(isset($_COOKIE[$this->cookie_name])){
- $this->sso_session=$_COOKIE[$this->cookie_name];
- }else{
- $this->expire=$expire;
- $this->expireAt=time()+$this->expire;
- //在IE6下的iframe无法获取到cookie,于是我使用了get方式传递了cookie的名字
- if(isset($_GET[$this->cookie_name])){
- $this->sso_session=$_GET[$this->cookie_name];
- }else{
- $this->sso_session=$this->session_folder.$session_prefix.md5(uniqid(rand(), true));
- }
- setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/");
- }
- }
- /*
- *设置过期时间
- *参数
- **/
- function expire($expire=86400){
- $this->expire=$expire;
- $this->expireAt=time()+$this->expire;
- //设置session过期时间
- setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/",".greatwallwine.com.cn");
- $this->redis->expireAt($this->sso_session, $this->expireAt);
- }
- /*
- *设置多个session的值
- *参数
- *$array:值
- **/
- function setMutil($array){
- $this->redis->hMset($this->sso_session,$array);
- }
- /*
- *设置session的值
- *参数
- *$key:session的key
- *$value:值
- **/
- function set($key,$value){
- $this->redis->hSet($this->sso_session,$key,$value);
- }
- /*
- *设置session的值为对象
- *参数
- *$key:session的key
- *$object:对象
- **/
- function setObject($key,$object){
- $this->redis->hSet($this->sso_session,$key,serialize($object));
- }
- /*
- *获取全部session的key和value
- @return: array
- **/
- function getAll(){
- return $this->redis->hGetAll($this->sso_session);
- }
- /*
- *获取一个session的key和value
- @return: array
- **/
- function get($key){
- return $this->redis->hGet($this->sso_session,$key);
- }
- /*
- *获取session的值为对象
- *参数
- *$key:session的key
- *$value:cookie的名字
- **/
- function getObject($key){
- return unserialize($this->redis->hGet($this->sso_session,$key));
- }
- /*
- *从缓存中获取一个session的key和value
- @return: array
- **/
- function getFromCache($key){
- if(!isset($this->cache)){
- $this->cache=$this->getAll();
- }
- return $this->cache[$key];
- }
- /*
- *删除一个session的key和value
- @return: array
- **/
- function del($key){
- return $this->redis->hDel($this->sso_session,$key);
- }
- /*
- *删除所有session的key和value
- @return: array
- **/
- function delAll(){
- return $this->redis->delete($this->sso_session);
- }
- }
- ?>
使用方法:
点击(此处)折叠或打开
- <?php
- error_reporting(0);
- $redisHost="192.168.1.2";
- $redisPort="6379";
- $redis = new Redis();
- $redis->connect($redisHost,$redisPort);
- include_once("inc/RedisSession.php");
- $redisSession=new RedisSession($redis);
- /*
- $redisSession->set("name","sdf4");
- $redisSession->set("age",1234);
- $redisSession->set("***","man14");
- $redisSession->set("name","abc4");
- $redisSession->setMutil(array("province"=>"guangdong","city"=>"guangzhou"));
- */
- $redisSession->setObject("obj",array("test1"=>array("test2")));
- $obj=$redisSession->getObject("obj");
- print_r($obj);
- die();
- print_r($redisSession->getAll());
- //$redisSession->del("name");
- print_r($redisSession->get("name"));
- //print_r($redisSession->get("province"));
- //$redisSession->delAll();
- //print_r($redisSession->getAll());
- print_r($redisSession->getFromCache("name"));
- /*
- $redisSession->del("name");
- $redisSession->delAll();
- */
比较常用的估计是set,get,setObject,getOject

[转载]用redis实现跨服务器session的更多相关文章
- 用redis实现跨服务器session(转)
这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡, 上面图上用户通过DNS的调度(一个域名对应多个ip)分别访问到VM2-VM5上,四台机器都访问VM1上的redis,两 ...
- PHP实现跨服务器session共享的方法教程
今天带来PHP实现跨服务器session共享的方法教程. 本文实例讲述了PHP实现cookie跨域session共享的方法.分享给大家供大家参考,具体如下: 做过web开发的小伙伴们都了解cookie ...
- php 跨域、跨子域,跨服务器读取session
1.跨子域和跨服务器解决方式 Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在 另一个是标志着Session数据的Se ...
- 跨服务器的session共享
四种 一.NFS(Net FileSystem): sun公司提供的,并发处理的效率不高,但操作方便 二.基于数据库的session共享 三.基于cookie的session共享 原理:将sessio ...
- PHP多台服务器跨域SESSION共享
网站业务规模和访问量的逐步发展,原本由单台服务器.单个域名的迷你网站架构已经无法满足发展需要. 此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服 ...
- 跨服务器之间的session共享
跨服务器之间的Session共享方案需求变得迫切起来,最终催生了多种解决方案,下面列举4种较为可行的方案进行对比探讨: 1. 基于NFS的Session共享 NFS是Net FileSystem的简称 ...
- Redis安装及实现session共享
一.Redis介绍 1.redis是key-value的存储系统,属于非关系型数据库 2.特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会 ...
- Using Redis to store php session
Using Redis to store php session 默认情况下,php将会将session信息存储在文件系统上,在单机情况下没有问题,但是当系统负载增大,或者在对系统可用性要求很高的场景 ...
- PHP中Redis替代文件存储Session语句
php默认使用文件存储session,如果并发量大,效率非常低.而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session. 这里,介绍下php的 session_set_s ...
随机推荐
- Jmeter 生成测试报告、Jenkins 配置
1. Jmeter 生成测试报告 示例: jmeter -n -t test.jmx -l result.jtl -e -o ./report 成功执行并生成报告: 生成报告失败:注意报告存放目录或 ...
- 盘点 HashMap 的实现原理及面试题
1.请你谈谈 HashMap 的工作原理如果被问到 HashMap 相关的问题,它的工作原理都会被作为面试的开场白,这个时候先装作若有所思的样子冷静一下.首先 HashMap 是基于 hashing ...
- GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组
1 drop table orders; 2 create table orders ( 3 o_id int auto_increment primary key, 4 orderdate date ...
- JavaWeb之分页查询
时间:2016-12-11 01:41 1.分页的优点: 只查询一页,不需要查询所有数据,能够提高效率.2.分页数据 页面的数据都是由Servlet传递的 * 当前页:pageC ...
- Go依赖包管理--间接依赖
目录 1.indirect含义 1.2 直接依赖未启用 Go module 1.2 直接依赖 go.mod 文件不完整 2.总结 1.indirect含义 在使用 Go module 过程中,随着引入 ...
- 你不知道的echarts,前端鲍哥带你研究!
前言 相信不少前端小伙伴刚接触 e-charts 肯定有点陌生,但是echarts咱不清楚,charts我们应该很熟悉,没错,echarts 就是我们日常可见的图表,不同的是 echarts 是用代码 ...
- IDEA常用设置及推荐插件
IDEA常用设置及推荐插件 本文主要记录IDEA的一些常用设置,IDEA与Eclipse的常用快捷键对比及推荐一些好用的插件. 基本设置 设置界面风格及修改外部UI尺寸大小 打开IDEA时设置不重新打 ...
- OpenCV配置及使用(Eclipse)
1.首先下载OpenCV,下载的时候,选择windows版的.然后安装,直接点击exe文件即可,安装过程实际就是一个解压的过程.2.注意解压之后的目录,opencv\build\java下的jar文件 ...
- GIMP 一键均匀添加多条参考线 一键均匀切分图片
添加参考线 #!/usr/bin/env python2 # -*- coding: utf-8 -*- from gimpfu import * # orientation: ORIENTATION ...
- Mysql常用sql语句(10)- is null 空值查询
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 is null是一个关键字来的,用于判断字段的值 ...