我可以使用codeigniter和redis来存储会话

时间:2015-10-28 16:30:12

标签: codeigniter redis

我将codeigniter 3用于我的项目,我想使用redis来存储会话 将它与nodejs和mysql一起用于实时通知系统

我在我的服务器上安装了redis并使用nodejs测试它是否正常工作

1 个答案:

答案 0 :(得分:0)

我不知道你是否还在寻找答案(也会帮助其他人),但这里有一个很好的链接(https://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/)  这解释了将会话数据序列化和反序列化为json。我已经在Codeigniter的库Session_redis_driver.php中进行了修改以进行编码和解码,因此我可以在Nodejs中使用它。如果有人可以验证此代码并指出任何陷阱或未处理的异常,我会很高兴。

  1. 修改"阅读"方法

    public function read($session_id)
    {
    if (isset($this->_redis) && $this->_get_lock($session_id))
    {
        // Needed by write() to detect session_regenerate_id() calls
        $this->_session_id = $session_id;
    
        $session_data = json_decode($this->_redis->get($this->_key_prefix.$session_id),TRUE);
    
        is_array($session_data)
            ? $this->_key_exists = TRUE
            : $session_data = '';
    
        $this->_fingerprint = md5(json_encode($session_data));
                    $tmp = $_SESSION;
                    $_SESSION = $session_data;
                    $new_data = session_encode();
                    $_SESSION = $tmp;
        return $new_data;
    }
    
    return $this->_fail();
    }
    
  2. 到目前为止,这项工作没有例外。

    1. 在写入方法中,已完成以下更改。

      if (isset($this->_lock_key))
      {
          $this->_redis->setTimeout($this->_lock_key, 300);
                      $tmp = $_SESSION;
                      session_decode($session_data);
                      $new_data = $_SESSION;
                      $_SESSION = $tmp;
          if ($this->_fingerprint !== ($fingerprint = md5(json_encode($new_data))) OR $this->_key_exists === FALSE)
          {
              if ($this->_redis->set($this->_key_prefix.$session_id, json_encode($new_data), $this->_config['expiration']))
              {
                  $this->_fingerprint = $fingerprint;
                  $this->_key_exists = TRUE;
                  return $this->_success;
              }
      
              return $this->_fail();
          }
      
          return ($this->_redis->setTimeout($this->_key_prefix.$session_id, $this->_config['expiration']))
              ? $this->_success
              : $this->_fail();
      }