PHP+redis实现session共享

  • Post author:
  • Post category:php




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 会自动执行公用文件)



版权声明:本文为lifei15731208550原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。