class RedisSession {
// 默认配置名称(使用load_config加载)
private $_default_config_path = 'package/cache/redis_session';
// sessions 最大生存时间,单位:秒
public $max_life_time = 0;
// 用作生成 session_id 的标识值
public $key_preffix = '';
// \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'];
empty($redis) and $redis = g('\\package\\cache\\Redis');
$this -> redis = $redis;
}
/**
* 调用这个方法代替session_start
*
* @access public
* @return void
*/
public function start() {
session_set_save_handler(
array(&$this, 'open'),
array(&$this, 'close'),
array(&$this, 'read'),
array(&$this, 'write'),
array(&$this, 'destroy'),
array(&$this, 'gc'),
array(&$this, 'create_id')
);
 
// 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为
register_shutdown_function('session_write_close');
session_start();
}
/**
* 获取redis缓存变量名
*
* @access public
* @param string $str 使用该字符串生成key
* @return string
*/
public function get_cache_key($str) {
$key = md5($str);
return $key;
}
/**
* 自定义session_id
*
* @access public
* @return string
*/
public function create_id() {
        $time = time();
        $ip = $this -> _get_ip();
        $uid = uniqid($this -> key_preffix, TRUE);
        $rand = get_rand_str(13);
        $key_str = 'session_id:ip:' . $ip . ':uid:' . $uid . ':time:' . $time . ':rand:' . $rand;
        $key = sha1($key_str);
        return $key;
}
/**
* session_open 将提交到该函数
*
* @access public
* @return boolean
*/
public function open($sess_id) {
$cache_key = $this -> get_cache_key(session_id());
$ret = $this -> redis -> expire($cache_key, $this -> max_life_time);
 
return $ret;
}
 
/**
* session_close将提交到该函数
*
* @access public
* @return boolean
*/
public function close() {
return true;
}
 
/**
* session_read将提交到该函数
*
* @access public
* @param string $sess_id session_id
* @return mixed
*/
public function read($sess_id) {
$cache_key = $this -> get_cache_key($sess_id);
$ret = $this -> redis -> get($cache_key);
return $ret;
}
 
/**
* session_write将提交到该函数
*
* @access public
* @param string $sess_id session_id
* @param string $sess_data session数据
* @return boolean
*/
public function write($sess_id, $sess_data) {
$cache_key = $this -> get_cache_key($sess_id);
$ret = $this -> redis -> set($cache_key, $sess_data, $this -> max_life_time);
return $ret;
}
/**
* session_destroy将提交到该函数
*
* @access public
* @param string $sess_id session_id
* @return boolean
*/
public function destroy($sess_id) {
session_unset();
$cache_key = $this -> get_cache_key($sess_id);
$ret = $this -> redis -> delete($cache_key);
return $ret;
}
/**
* session的gc回收将托管到该方法
*
* @access public
* @return void
*/
public function gc() {
}
 
    private function _get_ip(){
     static $ip = NULL;
     if ($ip !== NULL) return $ip;
    
     if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
     $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
     is_array($ip) and $ip = array_shift($ip);
     if (check_data($ip, 'ip')) return $ip;
     }
    
     if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
     $ip = $_SERVER['HTTP_CLIENT_IP'];
     if (check_data($ip, 'ip')) return $ip;
     }
    
     if (!empty($_SERVER['REMOTE_ADDR'])) {
     $ip = $_SERVER['REMOTE_ADDR'];
     if (check_data($ip, 'ip')) return $ip;
     }
    
     $ip = '';
     return $ip;
    }
}

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

  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. 分布式中使用Redis实现Session共享(二)

    上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...

  4. [转]分布式中使用Redis实现Session共享(二)

    本文转自:http://www.cnblogs.com/yanweidie/p/4678095.html 上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见 ...

  5. (转)分布式中使用Redis实现Session共享(二)

    上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见的session开始,刚好也重新学习一遍session的实现原理.在阅读之前假设你已经会使用nginx+i ...

  6. php用redis保存session

    1.修改php.ini中session配置: ini_set('session.save_handler', 'redis');ini_set('session.save_path', 'tcp:// ...

  7. nodejs express下使用redis管理session

    Session实现原理 实现请求身份验证的方式很多,其中一种广泛接受的方式是使用服务器端产生的Session ID结合浏览器的Cookie实现对Session的管理,一般来说包括以下4个步骤: 服务器 ...

  8. Tomcat7基于Redis的Session共享实战二

    目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无 ...

  9. Tomcat7基于Redis的Session共享实战一

    本文主要介绍如何使用redis对tomcat7的session进行托管. 1.安装Redisredis安装比较简单,此处略过. 2.配置两个Tomcat在本机上配置两个Tomcat,分别为tomcat ...

随机推荐

  1. 【springboot】【redis】springboot结合redis,操作List集合实现时间轴功能

    springboot结合redis,操作List集合实现时间轴功能

  2. CentOS安装mariadb做为mysql的替代品

    mariadb做为mysql的替代品 现在centos的新版本yum包已换成mariadb 安装一些库 yum install gcc gcc-c++ wget net-tools 复制代码 查看SE ...

  3. Java操作Linuxshell并且获取返回值

    /** * */package com.king.weixin.util;import java.io.BufferedReader;import java.io.InputStream;/*** @ ...

  4. 图解Windows下 GIT GUI 使用教程

    https://jingyan.baidu.com/article/19020a0a7ae6af529c284248.html 本篇经验将和大家介绍Windows下 GIT GUI 使用教程,希望对大 ...

  5. 每天一个linux命令:chown

    1.命令简介         chown(Change owner) 用来改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组.用户可以是用 ...

  6. 每天一个linux命令(6):cp

    1.命令简介 cp(Copy file):将源文件复制至目标文件,或将多个源文件复制至目标目录. 2.用法 cp [选项]... [-T] 源文件 目标文件 或:cp [选项]... 源文件... 目 ...

  7. atitit r9 doc on home ntpc .docx

    卷 p2soft 的文件夹 PATH 列表 卷序列号为 9AD0-D3C8 D:. │  Aittit pato 面对拒绝  的回应.docx │  Atitit  中国明星数量统计 attilax. ...

  8. Django Rest Framework(认证、权限、限制访问频率)

    阅读原文Django Rest Framework(认证.权限.限制访问频率) django_rest_framework doc django_redis cache doc

  9. Ajax 请求头中常见content-type

    四种常见的 POST 提交数据方式 HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范.规范把 HTTP 请求分为三个部分:状态行.请求头.消息主体.协议规定 POST ...

  10. FFmpeg libavutil主要功能概述

    [时间:2017-08] [状态:Open] [关键词:ffmpeg,avutil,avrational,avlog,avbuffer,avoptoin] 0 引言 FFmpeg使用很久了,一直没有认 ...