class RedisCookie {
// 默认配置名称(使用load_config加载)
private $_default_config_path = 'package/cache/redis_cookie';
// 当前用作服务端保存cookie数据的哈希名
private $_cookie_id = null;
// cookie中的每个变量(包含cookie_id本身), 在redis中的最大生存时间
public $max_life_time = 0;
// 用作生成 cookie_id 的标识值
public $key_preffix = '';
// 客户端cookie_id的变量名
public $id_client_var = '';
// 客户端cookie_id的保存domain
public $id_client_host = '';
// cookie_id保存于客户端时的有效时长,单位:秒
public $id_valid_time = 0;
// \package\cache\Redis 类的一个实例
public $redis = null;
 
/**
* 构造函数
*
* @access public
* @param objcet $redis 指定一个特定的 \package\cache\Redis 实例
* @return void
*/
public function __construct($redis=null) {
$conf = load_config($this -> _default_config_path);
if (!is_array($conf) or empty($conf)) {
to_log(MAIN_LOG_ERROR, '', __CLASS__ . ':' . __FUNCTION__ . ': 默认配置为空');
return;
}
isset($conf['max_life_time']) and $this -> max_life_time = $conf['max_life_time'];
isset($conf['key_preffix']) and $this -> key_preffix = $conf['key_preffix'];
isset($conf['id_client_var']) and $this -> id_client_var = $conf['id_client_var'];
isset($conf['id_client_host']) and $this -> id_client_host = $conf['id_client_host'];
isset($conf['id_valid_time']) and $this -> id_valid_time = $conf['id_valid_time'];
empty($redis) and $redis = g('\\package\\cache\\Redis');
$this -> redis = $redis;
}
/**
* 类似 session_start, 使用该类时调用这个方法初始化
*
* @access public
* @return void
*/
public function start() {
$this -> get_now_id();
}
/**
* 获取cookie_id
*
* @access public
* @param integer $id 指定使用该id作为cookie_id
* @return string
*/
public function get_now_id($id='') {
if (!empty($id)) {
$this -> _cookie_id = $id;
$this -> save_id();
$cookie_id = $id;
}else {
$cookie_id = $this -> get_id();
}
return $cookie_id;
}
/**
* 获取指定cookie数据
*
* @access public
* @param string $name 变量名
* @return mixed 失败返回(bool)false,否则返回(string)
*/
public function get($name='') {
$name = strval($name);
$hash = $this -> get_now_id();
if (empty($name) or empty($hash)) {
return false;
}
$key = $this -> get_cache_key($name);
try {
$redis = $this -> redis -> get_handler();
$ret = $redis -> hGet($hash, $key);
}catch(\RedisException $e) {
return false;
}
if ($ret === false) return false;
 
$ret = json_decode($ret, true);
if (!is_array($ret) or empty($ret)) return false;
if ($ret['ttl'] <= time()) {
$this -> delete($key);
return false;
}
$this -> renew();
$ret = $ret['data'];
return $ret;
}
/**
* 设置指定cookie数据
*
* @access public
* @param string $name 缓存变量名
* @param mixed $value 缓存变量值
* @param string $ttl 有效的生存时间
* @return boolean
*/
public function set($name, $value, $ttl=3600) {
$name = strval($name);
$hash = $this -> get_now_id();
if (empty($name) or empty($hash)) {
return false;
}
// 生存时间不能大于最大生存时间
$real_ttl = $ttl <= $this -> max_life_time ? $ttl : $this -> max_life_time;
$eff_end = time() + $real_ttl;
$cache_data = array(
'data' => $value,
'ttl' => $eff_end,
);
$key = $this -> get_cache_key($name);
$json_data = json_encode($cache_data);
try {
$redis = $this -> redis -> get_handler();
$ret = $redis -> hSet($hash, $key, $json_data);
}catch(\RedisException $e) {
return false;
}
if ($ret === false) return $ret;
$this -> renew();
return true;
}
/**
* 检测cookie_id是否已经被初始化
*
* @access public
* @return boolean
*/
public function check_id_exists() {
if (isset($_COOKIE[$this -> id_client_var])) {
return true;
}
return false;
}
/**
* 删除指定名称的cookie变量
*
* @access public
* @param string $name 变量名
* @return boolean
*/
public function delete($name='') {
$name = strval($name);
$hash = $this -> get_now_id();
if (empty($name) or empty($hash)) {
return false;
}
$key = $this -> get_cache_key($name);
try {
$redis = $this -> redis -> get_handler();
$ret = $redis -> hDel($hash, $key);
}catch(\RedisException $e) {
return false;
}
return $ret;
}
/**
* 删除该cookie_id下的全部数据
*
* @access public
* @return boolean
*/
public function destory() {
$hash = $this -> get_now_id();
if (empty($hash)) return false;
$this -> redis -> delete($hash);
$this -> _cookie_id = null;
setcookie($this -> id_client_var, '', time() - 3600, '/', $this -> id_client_host, false, true);
return true;
}
/**
* 获取或构造cookie_id(不存在时)
*
* @access private
* @return string
*/
private function get_id() {
if (!empty($this -> _cookie_id)) {
return $this -> _cookie_id;
}
 
if (isset($_COOKIE[$this -> id_client_var])) {
$this -> _cookie_id = $_COOKIE[$this -> id_client_var];
}else {
$this -> _cookie_id = $this -> create_id();
//保存cookie_id到客户端
$this -> save_id();
}
return $this -> _cookie_id;
}
/**
* 保存rcookie_id到客户端
*
* @access public
* @return void
*/
private function save_id() {
setcookie($this -> id_client_var, $this -> _cookie_id, time() + $this -> id_valid_time, '/', $this -> id_client_host, false, true);
}
/**
* 刷新cookie_id的生存时间
*
* @access private
* @return boolean
*/
private function renew() {
$hash = $this -> get_now_id();
if (empty($hash)) return false;
$ret = $this -> redis -> expire($hash, $this -> max_life_time);
return $ret;
}
/**
* 生成新的cookie_id
*
* @access private
* @return string
*/
private function create_id() {
$time = time();
$uid = uniqid($this -> key_preffix, true);
$rand = get_rand_str(3);
$key_str = "rcookie_id:uid:{$uid}:time:{$time}:rand:{$rand}";
$key = sha1($key_str);
return $key;
}
/**
* 获取redis缓存变量名
*
* @access private
* @param string $str 用作生成缓存变量的字符串
* @return string
*/
private function get_cache_key($str) {
$key = md5($str);
return $key;
}
}

使用redis接管cookie的更多相关文章

  1. PHP中使用Redis接管文件存储Session详解

    前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用redis替换文件来存储session. 最近就遇到了这个问题,之前找了网上的一套直播 ...

  2. PHP中如何使用Redis接管文件存储Session详解

    https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...

  3. .NET Core2.0+MVC 用Redis/Memory+cookie实现的sso单点登录

    之前发布过使用session+cookie实现的单点登录,博主个人用的很不舒服,为什么呢,博主自己测试的时候,通过修改host的方法,在本机发布了三个站点,但是,经过测试,发现,三个站点使用的sess ...

  4. 用redis和cookie做单用户登录

    因为公司的项目需要用到单用户登录,于是今天用redis和cookie给系统添加了单用户登录功能,再次简单记录一下. 单用户登录是为了防止同一账户在不同电脑和不同浏览器里面同时登录.所以我这边的思路是: ...

  5. springboot项目:登录 登录aop拦截 使用Redis与cookie 进行设置获取清除操作

    登录.登出: 第一步:在pom文件中引入依赖 <dependency> <groupId>org.springframework.boot</groupId> &l ...

  6. 使用redis接管session

    class RedisSession { // 默认配置名称(使用load_config加载) private $_default_config_path = 'package/cache/redis ...

  7. Yii2 redis与cache

    原文地址:http://www.myexception.cn/php/1974979.html composer require yiisoft/yii2-redis 安装后使用超简单,打开 comm ...

  8. Nginx+IIS+Redis 处理Session共享问题 1

    最近遇到一个棘手的问题,微信公众平台的前端站点session老是丢失,我们是走的微信网页授权,授权后获取用户openid,丢失后没有openid后续的操作全白搭了,因为没了openid只能判断为客户不 ...

  9. Flask系列08--Flask中flask_session, redis插件

    一.安装 1.flask_session 不想将Session的信息存放在Cookie 将Session存放在Redis Cookie中保存Session的ID flask中的session是直接将数 ...

随机推荐

  1. 论YUV422(YUYV)与YUV420相互转换

    Example 2.13. V4L2_PIX_FMT_YUYV 4 × 4 pixelimage start + 0: Y'00 Cb00 Y'01 Cr00 Y'02 Cb01 Y'03 Cr01 ...

  2. Spring Mvc配置多视图 - tiles, velocity, freeMarker, jsp

    <!-- Velocity --> <bean id="velocityViewResolver" class="org.springframework ...

  3. 微信公众号申请+新浪SAE申请

    一. 新浪SAE服务申请 1. 注冊地址:http://t.cn/RqMHPto 2. 选择控制台>>云应用SAE 3. 创建新应用 4. 填写域名 5. 代码管理选择SVN 6. 创建版 ...

  4. SSE图像算法优化系列二十八:深度优化局部拉普拉斯金字塔滤波器。

    基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物,写了很多文章)提出的,我在4年前曾经参考有关代码实现过这个算法,但是速 ...

  5. 通过Nginx反向代理之后客户端验证码session不一致造成无法验证通过的问题解决

    location / { proxy_pass http://127.0.0.1:9080/app/; proxy_cookie_path /app/ /; proxy_cookie_path /ap ...

  6. springboot配置idea 热部署

    背景: 在开发中,当我们修改代码之后,每次都要重新启动,很是浪费时间,在springboot中就有一种热部署方式,可以实现想要修改不需要每次都重新启动,保存即可生效 用法: 一.maven 添加   ...

  7. Docker的学习

    学习地址:http://blog.51cto.com/lizhenliang  和 他的视频 一  Docker 的介绍和安装 二 镜像管理 三 容器管理 四 管理应用程序数据 五 使用Docker知 ...

  8. Navicat(数据库可视化操作软件)安装、配置、测试

    Navicat(数据库可视化操作软件)安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.Navicat安装.激活与配置 4.简单测试 5.注意事项 6.相关博文 > ...

  9. WebRTC的视频解码原理简析

    WebRTC的视频部分,包含采集.编解码(I420/VP8).加密.媒体文件.图像处理.显示.网络传输与流控(RTP/RTCP)等功能. 视频采集---video_capture:       源代码 ...

  10. NaviSoft31.源码开发完成

    NaviSoft是作者一人开发完成,从之前的1.0版本,到现在的3.1版本.历经2年时间,开发完成 下面是NaviSoft的源码结构 加QQ群了解更多信息