Thinkphp\Library\Think\Session\Driver中新建redis缓存文件:Redis.class.php
Thinkphp\Common\function.php 中 function session($name='',$value='') //session说明文件 一:配置文件中新加:
//redis操作session
'SESSION_AUTO_START' => true, // 是否自动开启Session
'SESSION_TYPE' => 'Redis', //session类型
'SESSION_PERSISTENT' => , //是否长连接(对于php来说0和1都一样)
'SESSION_CACHE_TIME' => , //连接超时时间(秒)
'SESSION_EXPIRE' => , //session有效期(单位:秒) 0表示永久缓存
'SESSION_PREFIX' => 'sses_', //session前缀 二:Redis.class.php中内容:
<?php namespace Think\Session\Driver; /**
* Redis Session驱动
* 要求安装phpredis扩展:https://github.com/nicolasff/phpredis
* @category Think
* @package Session
* @subpackage Driver
* @version TP3.2~TP3.2.1
*/
class Redis implements \SessionHandlerInterface{ /**
* Redis句柄
*/
private $handler;
private $get_result; public function __construct(){
if ( !extension_loaded('redis') ) {
E(L('_NOT_SUPPERT_').':redis');
}
if(empty($options)) {
$options = array (
'host' => C('REDIS_HOST') ? C('REDIS_HOST') : '127.0.0.1',
'port' => C('REDIS_PORT') ? C('REDIS_PORT') : ,
'timeout' => C('SESSION_CACHE_TIME') ? C('SESSION_CACHE_TIME') : false,
'persistent' => C('SESSION_PERSISTENT') ? C('SESSION_PERSISTENT') : false,
'auth' => C('REDIS_AUTH') ? C('REDIS_AUTH') : false,
'dbindex' => C('REDIS_DBINDEX') ? C('REDIS_DBINDEX') : , //选择存库
);
}
$options['host'] = explode(',', $options['host']);
$options['port'] = explode(',', $options['port']);
$options['auth'] = explode(',', $options['auth']); foreach ($options['host'] as $key=>$value) {
if (!isset($options['port'][$key])) {
$options['port'][$key] = $options['port'][];
}
if (!isset($options['auth'][$key])) {
$options['auth'][$key] = $options['auth'][];
}
}
$this->options = $options;
$expire = C('SESSION_EXPIRE');
$this->options['expire'] = isset($expire) ? (int)$expire : (int)ini_get('session.gc_maxlifetime');;
$this->options['prefix'] = isset($options['prefix']) ? $options['prefix'] : C('SESSION_PREFIX');
$this->options['dbindex'] = isset($options['dbindex'])? $options['dbindex'] : ; //选择存库 $this->handler = new \Redis; } /**
* 连接Redis服务端
* @access public
* @param bool $is_master : 是否连接主服务器
*/
public function connect($is_master = true) {
if ($is_master) {
$i = ;
} else {
$count = count($this->options['host']);
if ($count == ) {
$i = ;
} else {
$i = rand(, $count - ); //多个从服务器随机选择
}
}
$func = $this->options['persistent'] ? 'pconnect' : 'connect';
try {
if ($this->options['timeout'] === false) {
$result = $this->handler->$func($this->options['host'][$i], $this->options['port'][$i]);
if (!$result)
throw new \Think\Exception('Redis Error', );
} else {
$result = $this->handler->$func($this->options['host'][$i], $this->options['port'][$i], $this->options['timeout']);
if (!$result)
throw new \Think\Exception('Redis Error', );
}
if ($this->options['auth'][$i]) {
$result = $this->handler->auth($this->options['auth'][$i]);
if (!$result) {
throw new \Think\Exception('Redis Error', );
}
}
//选择db存库
if ( != $this->options['dbindex']) {
$this->handler->select($this->options['dbindex']);
} } catch ( \Exception $e ) {
exit('Error Message:'.$e->getMessage().'<br>Error Code:'.$e->getCode().'');
}
} /**
* 打开Session
* @access public
* @param string $savePath
* @param mixed $sessName
*/
public function open($savePath, $sessName) {
return true;
} /**
* 关闭Session
* @access public
*/
public function close() {
if ($this->options['persistent'] == 'pconnect') {
$this->handler->close();
}
return true;
} /**
* 读取Session
* @access public
* @param string $sessID
*/
public function read($sessID) {
$this->connect();
$this->get_result = $this->handler->get($this->options['prefix'].$sessID);
return $this->get_result;
} /**
* 写入Session
* @access public
* @param string $sessID
* @param String $sessData
*/
public function write($sessID, $sessData) {
if (!$sessData || $sessData == $this->get_result) {
return true;
}
$this->connect();
$expire = $this->options['expire'];
$sessID = $this->options['prefix'].$sessID;
if(is_int($expire) && $expire > ) {
$result = $this->handler->setex($sessID, $expire, $sessData);
$re = $result ? 'true' : 'false';
}else{
$result = $this->handler->set($sessID, $sessData);
$re = $result ? 'true' : 'false';
}
return $result;
} /**
* 删除Session
* @access public
* @param string $sessID
*/
public function destroy($sessID) {
$this->connect();
return $this->handler->delete($this->options['prefix'].$sessID);
} /**
* Session 垃圾回收
* @access public
* @param string $sessMaxLifeTime
*/
public function gc($sessMaxLifeTime) {
return true;
} /**
* 打开Session
* @access public
* @param string $savePath
* @param mixed $sessName
*/
public function execute() {
session_set_save_handler(
array(&$this, "open"),
array(&$this, "close"),
array(&$this, "read"),
array(&$this, "write"),
array(&$this, "destroy"),
array(&$this, "gc")
);
} public function __destruct() {
if ($this->options['persistent'] == 'pconnect') {
$this->handler->close();
}
session_write_close();
} }

【原】thinkphp实现存储session至redis的更多相关文章

  1. PHP中使用Redis接管文件存储Session详解

    前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用redis替换文件来存储session. 最近就遇到了这个问题,之前找了网上的一套直播 ...

  2. PHP中如何使用Redis接管文件存储Session详解

    https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...

  3. (转)Tomcat7+Redis存储Session

    原创http://blog.csdn.net/caiwenfeng_for_23/article/details/45666831 PS:截止到2015-05-12前是不支持Tomcat8的,详情见官 ...

  4. redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题

    先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...

  5. redis 存储session实现session共享

    nginx 作为代理 tomcat集群 redis存储共享session nginx采用轮询方式将动态请求反向代理给tomcat,tomcat通过加载相应jar包方式实现获得redis中共享的sess ...

  6. Tomcat 使用Redis存储Session

    Tomcat Redis Session Github 地址. 下载 commons-pool2-2.2.jar,jedis-2.5.2.jar,tomcat-redis-session-manage ...

  7. Asp.net Core 使用Redis存储Session

    前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一, ...

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

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

  9. Tomcat7+Redis存储Session(转)

    PS:截止到2015-05-12前是不支持Tomcat8的,详情见官网:https://github.com/jcoleman/tomcat-redis-session-manager 前提:你已经部 ...

随机推荐

  1. Apache2.2安装

    貌似Apache官网从2.2.X之后不再发布Windows安装版本,需要的话得自己编译 从官网下载2.2.25(我下了一个no-ssl的),安装提示 因为本机已经安装IIS,占用80端口,修改Apac ...

  2. tf.float32 implicity

    简介  |  TensorFlow https://tensorflow.google.cn/programmers_guide/low_level_intro 我们来构建一个简单的计算图.最基本的指 ...

  3. Java 泛型 五:泛型与数组

    简介 上一篇文章介绍了泛型的基本用法以及类型擦除的问题,现在来看看泛型和数组的关系.数组相比于Java 类库中的容器类是比较特殊的,主要体现在三个方面: 数组创建后大小便固定,但效率更高 数组能追踪它 ...

  4. vue实例以及生命周期

    1.Vue实例API 1.构造器(实例化) var vm = new Vue({ //选项 |-------DOM(3) |   |-------el (提供一个在页面上已存在的 DOM 元素作为 V ...

  5. C# 判断两个矩形是否相交

    源代码 public bool JudgeRectangleIntersect(double RecAleftX, double RecAleftY, double RecArightX, doubl ...

  6. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】

    算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...

  7. bzoj4720: [Noip2016]换教室(期望dp)

    4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1294  Solved: 698[Submit][Status ...

  8. [算法] 常见排序算法总结(C语言版)

    常见排序算法总结 本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出了比较精简的实现代码,包括选择排序.插入排序.归并排序.希尔排序.快速排序等.算法性能比较如下图所示: 1 冒泡排序 基本原 ...

  9. 题解报告:hdu 1035 Robot Motion(简单搜索一遍)

    Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...

  10. Too many open files故障解决一例

    Linux环境WebSphere输出日志: [// ::: EDT] 000090b7 SystemErr R Caused by: java.io.FileNotFoundException: /o ...