session 加入redis的实现代码


Posted in PHP onJuly 15, 2016

Session信息入redis

Session简介

session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在 一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。

在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥

为什么要把SESSION保存在缓存

就php来说,语言本身支持的session是以文件的方式保存到磁盘文件中,保存在指定的文件夹中,保存的路径可以在配置文件中设置或者在程序中使用函数session_save_path()进行设置,但是这么做有弊端,
第一就是保存到文件系统中,效率低,只要有用到session就会从好多个文件中查找指定的sessionid,效率很低。
第二就是当用到多台服务器的时候可能会出现,session丢失问题(其实是保存在了其他服务器上)。
当然了,保存在缓存中可以解决上面的问题,如果使用php本身的session函数,可以使用 session_set_save_handler()函数很方便的对session的处理过程进行重新控制。如果不用php的session系列函数, 可以自己编写个类似的session函数,也是可以的,我现在做的这个项目就是这样,会根据用户的mid、登录时间进行求hash作为 sessionId,每次请求的时候都必须加上sessionId才算合法(第一次登录的时候是不需要的,这个时候会创建sessionId,返回给客户 端),这么做也很方便、简洁高效的。当然了,我这篇文章主要说的是在php自身的SESSION中”做做手脚”。

SESSION保存在缓存中

php将缓存保存到redis中,可以使用配置文件,对session的处理和保存做修改,当然了,在程序中使用ini_set()函数去修改也可以,这个很方便测试,我这里就使用这种方式,当然了,要是生产环境还是建议使用配置文件。

如果想简单操作session入redis操作可以将一下代码运行一下

<?php 
 
ini_set("session.save_handler", "redis"); 
 
ini_set("session.save_path", "tcp://localhost:6379"); 
 
session_start(); 
 
header("Content-type:text/html;charset=utf-8"); 
 
if(isset($_SESSION['view'])){ 
 
  $_SESSION['view'] = $_SESSION['view'] + 1; 
 
}else{ 
 
  $_SESSION['view'] = 1; 
 
} 
 
echo "【view】{$_SESSION['view']}"; 
 
//这里设置session.save_handler方式为redis,session.save_path为redis的地址和端口,设置之后刷新,再回头查看redis,会发现redis中的生成了sessionId,sessionId和浏览器请求的是一样的, 
 
  
 
//也可以使用 
 
Session_set_save_handler(‘open','close',' read',' write',' destory',' gc'); 
 
//用法如下自定义一个Redis_session类 
 
<?php 
 
class RedisSession{ 
 
  private $_redis = array( 
 
    'handler' => null, //数据库连接句柄 
 
    'host' => null,  //redis端口号 
 
    'port' => null, 
 
  ); 
 
  public function __construct($array = array()){ 
 
    isset($array['host'])?$array['host']:"false"; 
 
    isset($array['port'])?$array['host']:"false"; 
 
    $this->_redis = array_merge($this->_redis, $array); 
 
  } 
 
  public function begin(){ 
 
    //设置session处理函数 
 
    session_set_save_handler( 
 
      array($this, 'open'), 
 
      array($this, 'close'), 
 
      array($this, 'read'), 
 
      array($this, 'write'), 
 
      array($this, 'destory'), 
 
      array($this, 'gc') 
 
    ); 
 
  } 
 
  public function open(){ 
 
    $redis = new Redis(); 
 
    $redis->connect($this->_redis['host'], $this->_redis['port']); 
 
    if(!$redis){ 
 
      return false; 
 
    } 
 
  
 
    $this->_redis['handler'] = $redis; 
 
    $this->gc(null); 
 
    return true; 
 
  } 
 
  //关 
 
  public function close(){ 
 
    return $this->_redis['handler']->close(); 
 
  } 
 
  //读 
 
  public function read($session_id){ 
 
    return $this->_redis['handler']->get($session_id); 
 
  } 
 
  //写 
 
  public function write($sessionId, $sessionData){ 
 
    return $this->_redis['handler']->set($sessionId, $sessionData); 
 
  } 
 
  public function destory($sessionId){ 
 
    return $this->_redis['handler']->delete($sessionId) >= 1 ? true : false; 
 
  } 
 
  public function gc(){ 
 
    //获取所有sessionid,让过期的释放掉 
 
    $this->_redis['handler']->keys("*"); 
 
    return true; 
 
  } 
 
} 
 
$ses = new RedisSession(array('host'=>'127.0.0.1','port'=>'6379')); 
 
$ses->begin(); 
 
session_start(); 
 
$_SESSION['name']='zhangsan'; 
 
echo $_SESSION['name'];

这样就可以实现session数据如redis代码执行过程中必须安装redis才可以。

PHP 相关文章推荐
MySql中正则表达式的使用方法描述
Jul 30 PHP
php下防止单引号,双引号在接受页面转义的设置方法
Sep 25 PHP
PHP实现的MongoDB数据库操作类分享
May 12 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
Mar 13 PHP
PHP关联数组实现根据元素值删除元素的方法
Jun 26 PHP
PHP递归创建多级目录
Nov 05 PHP
利用php抓取蜘蛛爬虫痕迹的示例代码
Sep 30 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
yii2.0整合阿里云oss上传单个文件的示例
Sep 19 PHP
laravel-admin的图片删除实例
Sep 30 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 #PHP
功能强大的PHP POST提交数据类
Jul 15 #PHP
Yii的Srbac插件用法详解
Jul 14 #PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 #PHP
Yii视图操作之自定义分页实现方法
Jul 14 #PHP
全面解析PHP操作Memcache基本函数
Jul 14 #PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 #PHP
You might like
社区(php&amp;&amp;mysql)三
2006/10/09 PHP
由php if 想到的些问题
2008/03/22 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
javascript 基础篇1 什么是js 建立第一个js程序
2012/03/14 Javascript
jquery事件与函数的使用介绍
2013/09/29 Javascript
jQuery功能函数详解
2015/02/01 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
基于node搭建服务器,写接口,调接口,跨域的实例
2018/05/13 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
2019/04/23 Javascript
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Django如何自定义分页
2018/09/25 Python
django框架实现模板中获取request 的各种信息示例
2019/07/01 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
2020/04/10 Python
快速了解Python开发环境Spyder
2020/06/29 Python
python文件排序的方法总结
2020/09/13 Python
python/golang 删除链表中的元素
2020/09/14 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
狮子林导游词
2015/02/03 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书