PHP+redis实现session共享

本文介绍了一种将PHP Session存储于Redis的方法,实现Session共享,适用于分布式环境。通过自定义session_set_save_handler函数,利用Redis作为后端存储,增强网站性能与可扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PHP SESSION 共享 REDSI

公用文档

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);
	}
	
	
	
	### 2
	/**
	 * 开始使用该驱动的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']);
	    $redisHandle->auth($this->_options['password']);
	    if (!$redisHandle) {
	        return false;
	    }
	
	    $this->_options['handler'] = $redisHandle;
	    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 json_decode($this->_options['handler']->hget($this->_options['weizhi'],$sessionId));
	}
	
	/**
	 * 写入或者修改session数据
	 * @param $sessionId 要写入数据的session对应的id
	 * @param $sessionData 要写入的数据,已经序列化过了
	 */
	public function write($sessionId, $sessionData)
	{
	    $sessionId = $this->_options['prefix'] . $sessionId;
	    $this->_options['handler']->hset($this->_options['weizhi'],$sessionId,json_encode($sessionData));
	    //设置redis 过期时间
	    $this->_options['handler']->expire($this->_options['weizhi'],$sessionId);
	
	    return true;
	}
	
	/**
	 * 主动销毁session会话
	 * @param $sessionId 要销毁的会话的唯一id
	 */
	public function destory($sessionId)
	{
	    $sessionId = $this->_options['prefix'] . $sessionId;
	    return $this->_options['handler']->hdel($this->_options['weizhi'],$sessionId) >= 1 ? true : false;
	}
	
	/**
	 * 清理绘画中的过期数据
	 * @param 有效期
	 */
	public function gc($lifeTime)
	{
	    //获取所有sessionid,让过期的释放掉
	    //$this->_options['handler']->keys("*");
	    return true;
	}
调用
	require(ROOT_PATH . 'includes/lib_session_redis.php');
	$handler = new redisSession(array(
    'host' => REDIS_HOST,
    'port' => REDIS_POST,
    'weizhi'=>'admin',
    'password'=>PASSWORD
	));
	$handler->begin();

	session_start();

公用文档放到指定位置,在根目录引入(根目录头部需要开始session_star() ,只要调用session 会自动执行公用文件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟学习成功之路-李飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值