redisSession

<?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 #### 配置环境并初始化连接 为了使应用程序能够利用 Redis 来存储 session 数据,在不同框架下需要做相应的配置工作。对于 Struts2 结合 Spring Security 和 spring-session-data-redis 的项目来说,除了引入必要的依赖外,还需要定义一些特定于 Redis 连接以及 session 管理的 Bean 实例[^2]。 ```xml <!-- Maven Dependency --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> ``` 接着通过 Java Config 或 XML 文件来声明这些 Beans: ```java @Configuration @EnableRedisHttpSession public class HttpSessionConfig { } ``` 以上代码片段展示了如何启用基于 Redis 的 HTTP 会话支持,并允许进一步定制化设置,比如指定序列化方式、设定超时期限等属性。 #### 修改或更新已存在的 Session 数据 当涉及到修改已经存在于 Redis 中的 session 信息时,只需要再次调用 `setAttribute` 方法即可完成操作。这将会覆盖原有的键值对条目,从而实现数据更新的目的[^1]。 ```java // 假设当前请求对象为 request request.getSession().setAttribute("key", "newValue"); ``` 这段简单的代码可以用来向现有的 session 添加新的属性或者更改已有属性的内容。 #### Laravel 下的特殊处理 针对 PHP 开发者常用的 Laravel 框架而言,默认情况下它会选择 phpredis 客户端库来进行与 Redis 的交互;然而开发者也可以切换到 predis 库以适应不同的需求场景。具体做法是在项目的 `.env` 文件里添加一行配置指令指明所使用的客户端名称[^3]。 ```bash REDIS_CLIENT=predis ``` 此外还需确保在 `config/database.php` 及其他关联位置正确设置了 Redis 相关参数,以便顺利建立通信链路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值