我将codeigniter 3用于我的项目,我想使用redis来存储会话 将它与nodejs和mysql一起用于实时通知系统
我在我的服务器上安装了redis并使用nodejs测试它是否正常工作
答案 0 :(得分:0)
我不知道你是否还在寻找答案(也会帮助其他人),但这里有一个很好的链接(https://simplapi.wordpress.com/2012/04/13/php-and-node-js-session-share-redi/) 这解释了将会话数据序列化和反序列化为json。我已经在Codeigniter的库Session_redis_driver.php中进行了修改以进行编码和解码,因此我可以在Nodejs中使用它。如果有人可以验证此代码并指出任何陷阱或未处理的异常,我会很高兴。
修改"阅读"方法
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();
}
到目前为止,这项工作没有例外。
在写入方法中,已完成以下更改。
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();
}