首頁 > 後端開發 > php教程 > 使用Redis存储Session,如果只设置一个值就无法删除

使用Redis存储Session,如果只设置一个值就无法删除

WBOY
發布: 2016-06-06 20:18:21
原創
1387 人瀏覽過

使用Redis存储Session,如果只设置一个值就无法删除

如图所示,执行unset($_SESSION['name'])是无法删除的;
只有在有多个session,并且name不在首位才能被删除,在首位的session都不能被删除。请问这个情况大家遇到吗?

我在线上和线下都试过,无法解决


找到问题所在了,是由于我改写了session_set_save_handler()方法:

<code><?php /**
 * Session Redis存贮
 * @version            v1.0
 * @author             Lay
 */
class Session_Redis extends Session {
    /**
     * @var string 键前缀
     */
    const CACHE_KEY = 'SESSION:';

    /**
     * @var object 数据库对象
     */
    private $_cache = null;

    /**
     * 开始Session
     *
     * @return void
     */
    public function __construct($cache) {
        $this->_cache = $cache;
        $this->_lifetime = ini_get('session.gc_maxlifetime');
        session_set_save_handler(
            array($this, '_open'),
            array($this, '_close'),
            array($this, '_read'),
            array($this, '_write'),
            array($this, '_destroy'),
            array($this, '_gc')
        );
    }

    // _open
    public function _open($savePath, $name) {
        return true;
    }

    // _close
    public function _close() {
        $this->_gc($this->_lifetime);
        return true;
    }

    // _read
    public function _read($id) {
        $res = $this->_cache->get(self::CACHE_KEY . $id, FALSE);
        return $res ? $res : '';
    }

    // _write
    public function _write($id, $value) {
        if ($value) {
            $flag = $this->_cache->set(self::CACHE_KEY . $id, $value, intval($this->_lifetime), FALSE);
            return $flag;
        } else {
            return FALSE;
        }
    }

    // _destroy
    public function _destroy($id) {
        $flag = $this->_cache->delete(self::CACHE_KEY . $id);
        return $flag;
    }

    // _gc
    public function _gc($lifetime) {
    }
}
</code>
登入後複製
登入後複製

调用:

<code>$cache = load_cache(); // 返回Redis对象
$handle = new Session_Redis($cache);</code>
登入後複製
登入後複製

代码有什么问题吗?

回复内容:

使用Redis存储Session,如果只设置一个值就无法删除

如图所示,执行unset($_SESSION['name'])是无法删除的;
只有在有多个session,并且name不在首位才能被删除,在首位的session都不能被删除。请问这个情况大家遇到吗?

我在线上和线下都试过,无法解决


找到问题所在了,是由于我改写了session_set_save_handler()方法:

<code><?php /**
 * Session Redis存贮
 * @version            v1.0
 * @author             Lay
 */
class Session_Redis extends Session {
    /**
     * @var string 键前缀
     */
    const CACHE_KEY = 'SESSION:';

    /**
     * @var object 数据库对象
     */
    private $_cache = null;

    /**
     * 开始Session
     *
     * @return void
     */
    public function __construct($cache) {
        $this->_cache = $cache;
        $this->_lifetime = ini_get('session.gc_maxlifetime');
        session_set_save_handler(
            array($this, '_open'),
            array($this, '_close'),
            array($this, '_read'),
            array($this, '_write'),
            array($this, '_destroy'),
            array($this, '_gc')
        );
    }

    // _open
    public function _open($savePath, $name) {
        return true;
    }

    // _close
    public function _close() {
        $this->_gc($this->_lifetime);
        return true;
    }

    // _read
    public function _read($id) {
        $res = $this->_cache->get(self::CACHE_KEY . $id, FALSE);
        return $res ? $res : '';
    }

    // _write
    public function _write($id, $value) {
        if ($value) {
            $flag = $this->_cache->set(self::CACHE_KEY . $id, $value, intval($this->_lifetime), FALSE);
            return $flag;
        } else {
            return FALSE;
        }
    }

    // _destroy
    public function _destroy($id) {
        $flag = $this->_cache->delete(self::CACHE_KEY . $id);
        return $flag;
    }

    // _gc
    public function _gc($lifetime) {
    }
}
</code>
登入後複製
登入後複製

调用:

<code>$cache = load_cache(); // 返回Redis对象
$handle = new Session_Redis($cache);</code>
登入後複製
登入後複製

代码有什么问题吗?

没有遇到过,你确认下是不是被重新生成了,可以unset($_SESSION['name'])以后,给$_SESSION['name']重新赋值试试。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板