PHP实现redis存储session
来源:互联网 发布:在linux中发送url请求 编辑:程序博客网 时间:2024/05/16 09:47
一、首先实现SessionHandlerInterface(此接口PHP>5.4.0),如下
<?php/** * 以db的方式存储session */namespace OC\Session;class redisSession implements \SessionHandlerInterface{ /** * 保存session的redis的信息 */ private $_options = array( 'handler' => null, //redis连接句柄 'host' => null, 'port' => null, 'lifeTime' => null, ); /** * 构造函数 * @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){ return $this->_options['handler']->get($sessionId); } /** * 写入或者修改session数据 * @param $sessionId 要写入数据的session对应的id * @param $sessionData 要写入的数据,已经序列化过了 */ public function write($sessionId, $sessionData){ return $this->_options['handler']->setex($sessionId, $this->_options['lifeTime'], $sessionData); } /** * 主动销毁session会话 * @param $sessionId 要销毁的会话的唯一id */ public function destroy($sessionId){ return $this->_options['handler']->delete($sessionId) >= 1 ? true : false; } /** * 清理绘画中的过期数据 * @param 有效期 */ public function gc($lifeTime){ //获取所有sessionid,让过期的释放掉 $this->_options['handler']->keys("*"); return true; }}以上就是一个完整的实现接口的类,在此封装成一个文件
二、调用时使用方法:
session_set_save_handler(\OC::$server->getRedisSession(),true);register_shutdown_function('session_write_close');session_start();也就是在session_start()方法之前调用,相当于告诉session存储位置变成redis存储,至此,以后使用的所有$_SESSION方法存储的数据都会自动放到redis中去,而存储用的key值就是session_id().
三、解释:
\OC::$server->getRedisSession()
以上的调用对象的方法时使用了pimple容器存储对象并调用的方式。具体如下使用:
namespace OC;
class Server extends SimpleContainer implements IServerContainer {
在此server类中注册加入对象,
$this->registerService('RedisSession',function (Server $c) { return new \OC\Session\redisSession( $c->getSystemConfig()->getValue('redis') );});获取对象方式:
/** * 新增的获取用户redissession的方法 */public function getRedisSession() { return $this->query('RedisSession');}其实也就是
session_set_save_handler(\OC::$server->getRedisSession(),true);中的
\OC::$server->getRedisSession()
就是上面一、中的类的对象
参考:http://www.tuicool.com/articles/yeeyume
0 0
- PHP实现redis存储session
- php Redis存储Session
- Redis SpringSession+Redis实现分布式Session存储
- PHP+Redis实现Session共享
- php+redis实现session共享
- redis 替代php文件存储session
- php Session存储到Redis的方法
- PHP中Redis替代文件存储Session
- php Session存储到Redis的方法
- 用redis实现跨服务器存储session
- php+redis实现多台服务器内网存储session并读取
- php+redis实现多台服务器内网存储session并读取
- PHP分布式中Redis实现Session
- 用Redis存储Tomcat集群的Session实现session共享
- Spring Session + Redis 实现Session的分布式存储
- php实现session数据存储到数据库
- php 实现自定义session存储方式
- 使用redis作为php中session的存储介质
- 多媒体之播放音乐——MediaPlayer
- 怎样不重装修复windows 8.1系统文件
- Android详细的对话框AlertDialog.Builder使用方法
- UVa 1347:Tour(DP)
- rsync+sersync2多个web网站同步
- PHP实现redis存储session
- 如何使用Log4j
- Unity物理引擎:关节简介(角色关节)
- 通过一个C++类复习一些技术
- 从css3书写顺序引出来的border-radius参数
- 【读书笔记】iOS-特性
- 查看linux libc版本
- 关于 this android sdk requires android developer...错误的解决办法
- CUDA存储器模型