通过redis实现session共享-php
<?php
class redisSession{
/**
* 保存session的数据库表的信息
*/
private $_options = array(
'handler' => null, //数据库连接句柄
'host' => null,
'port' => null,
'lifeTime' => null,
'prefix' => 'PHPREDIS_SESSION:'
); /**
* 构造函数
* @param $options 设置信息数组
*/
public function __construct($options=array()){
if(!class_exists("redis", false)){
die("必须安装redis扩展");
}
if(!isset($options['lifeTime']) || $options['lifeTime'] <= 0){
$options['lifeTime'] = ini_get('session.gc_maxlifetime');
}
$this->_options = array_merge($this->_options, $options);
} /**
* 开始使用该驱动的session
*/
public function begin(){
if($this->_options['host'] === null ||
$this->_options['port'] === null ||
$this->_options['lifeTime'] === null
){
return false;
}
//设置session处理函数
session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destory'),
array($this, 'gc')
);
}
/**
* 自动开始回话或者session_start()开始回话后第一个调用的函数
* 类似于构造函数的作用
* @param $savePath 默认的保存路径
* @param $sessionName 默认的参数名,PHPSESSID
*/
public function open($savePath, $sessionName){
if(is_resource($this->_options['handler'])) return true;
//连接redis
$redisHandle = new Redis();
$redisHandle->connect($this->_options['host'], $this->_options['port']);
if(!$redisHandle){
return false;
} $this->_options['handler'] = $redisHandle;
// $this->gc(null);
return true; } /**
* 类似于析构函数,在write之后调用或者session_write_close()函数之后调用
*/
public function close(){
return $this->_options['handler']->close();
} /**
* 读取session信息
* @param $sessionId 通过该Id唯一确定对应的session数据
* @return session信息/空串
*/
public function read($sessionId){
$sessionId = $this->_options['prefix'].$sessionId;
return $this->_options['handler']->get($sessionId);
} /**
* 写入或者修改session数据
* @param $sessionId 要写入数据的session对应的id
* @param $sessionData 要写入的数据,已经序列化过了
*/
public function write($sessionId, $sessionData){
$sessionId = $this->_options['prefix'].$sessionId;
return $this->_options['handler']->setex($sessionId, $this->_options['lifeTime'], $sessionData);
} /**
* 主动销毁session会话
* @param $sessionId 要销毁的会话的唯一id
*/
public function destory($sessionId){
$sessionId = $this->_options['prefix'].$sessionId;
// $array = $this->print_stack_trace();
// log::write($array);
return $this->_options['handler']->delete($sessionId) >= 1 ? true : false;
} /**
* 清理绘画中的过期数据
* @param 有效期
*/
public function gc($lifeTime){
//获取所有sessionid,让过期的释放掉
//$this->_options['handler']->keys("*");
return true;
}
//打印堆栈信息
public function print_stack_trace()
{
$array = debug_backtrace ();
//截取用户信息
$var = $this->read(session_id());
$s = strpos($var, "index_dk_user|");
$e = strpos($var, "}authId|");
$user = substr($var,$s+14,$e-13);
$user = unserialize($user);
//print_r($array);//信息很齐全
unset ( $array [0] );
if(!empty($user)){
$traceInfo = $user['id'].'|'.$user['user_name'].'|'.$user['user_phone'].'|'.$user['presona_name'].'++++++++++++++++\n';
}else{
$traceInfo = '++++++++++++++++\n';
}
$time = date ( "y-m-d H:i:m" );
foreach ( $array as $t ) {
$traceInfo .= '[' . $time . '] ' . $t ['file'] . ' (' . $t ['line'] . ') ';
$traceInfo .= $t ['class'] . $t ['type'] . $t ['function'] . '(';
$traceInfo .= implode ( ', ', $t ['args'] );
$traceInfo .= ")\n";
}
$traceInfo .= '++++++++++++++++';
return $traceInfo;
} }
入口处调用
$handler = new redisSession(array(
'host' => "127.0.0.1",
'port' => "6379"
));
$handler->begin();
通过redis实现session共享-php的更多相关文章
- 分布式中使用Redis实现Session共享(二)
上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...
- 分布式Session共享(一):tomcat+redis实现session共享
一.前言 本文主要测试redis实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port Tomcat ...
- 负载均衡,最理想使用 redis实现session共享
负载均衡在多台php服务器负载均衡的情况下,第一秒请求是a服务器,第二秒请求是b服务器, session必须放在一个公共的服务器,最理想是使用 redis实现session共享.内存的速度比磁盘访问快 ...
- 单点登录实现(spring session+redis完成session共享)
一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
小伙伴们好久不见!最近略忙,博客写的有点少,嗯,要加把劲.OK,今天给大家带来一个JavaWeb中常用的架构搭建,即Nginx+Tomcat搭建服务集群,然后通过Spring Session+Redi ...
- CentOS7 PHP+Redis实现Session共享
先yum简单的安装redis wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/epel-7.repo ...
- spring-session+Redis实现Session共享
关于session共享的方式有多种: (1)通过nginx的ip_hash,根据ip将请求分配到对应的服务器 (2)基于关系型数据库存储 (3)基于cookie存储 (4)服务器内置的session复 ...
- nginx+tomcat实现集群,redis实现session共享,软连接实现文件共享:http://blog.csdn.net/hua1586981/article/details/78132710
转载 2017年02月08日 16:52:41 730 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食apache和IIS的份额.那究竟它有什么作用呢?可能很多人未必了解. 说到反向代理,可能 ...
- Tomcat通过Redis实现session共享的完整部署记录
对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...
随机推荐
- 【[AHOI2008]逆序对】
被锤爆了 被这个题搞得自闭了一上午,觉得自己没什么前途了 我又没有看出来这个题的一个非常重要的性质 我们填进去的数一定是单调不降的 首先如果填进去的数并不是单调不降的,那么填进去本身就会产生一些逆序对 ...
- Hadoop学习之路(二十)MapReduce求TopN
前言 在Hadoop中,排序是MapReduce的灵魂,MapTask和ReduceTask均会对数据按Key排序,这个操作是MR框架的默认行为,不管你的业务逻辑上是否需要这一操作. 技术点 MapR ...
- 贪心——HDU-5969 最大的位或
HDU-5969:http://acm.hdu.edu.cn/showproblem.php?pid=5969 一开始也是分了类,觉得要两种情况,l 与 r 位数相同与不同的情况,仔细想一下,可以一起 ...
- [Python 网络编程] TCP、简单socket模拟ssh (一)
OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...
- Azure Blob数据迁移工具
数据迁移备份,更多的应用场景见https://docs.azure.cn/zh-cn/storage/common/storage-moving-data?toc=%2fstorage%2fblobs ...
- ios下元素溢出设置 overflow:auto; 不能滑动解决办法
ios下元素溢出设置 overflow:auto; 不能滑动解决办法: overflow:auto; overflow-y:scroll; -webkit-overflow-scrolling:tou ...
- linux 下线程错误查找,与线程分析命令
一. 使用top和jstack查找线程错误 我们使用jdk自带的jstack来分析.当linux出现cpu被java程序消耗过高时,以下过程说不定可以帮上你的忙: 1.top查找出哪个进程消耗的cpu ...
- #ifdef 和 #if defined的区别
#ifdef 和 #if defined的区别在于,后者可以组成复杂的预编译条件,比如 #if defined (AAA) && defined (BBB)xxxxxxxxx#endi ...
- 前端css小米导航栏设置及盒子定位居中问题
1.小米最上部导航栏设置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- CentOS7安装及相关配置转载
1. 怎样在 CentOS 7.0 上安装和配置 VNC 服务器 https://linux.cn/article-5335-1.html 2. 安装完最小化 RHEL/CentOS 7 后需要做的 ...