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 相关文章推荐
php IP转换整形(ip2long)的详解
Jun 06 PHP
php中的Base62类(适用于数值转字符串)
Aug 12 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
Jun 05 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Jun 19 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
简单谈谈php中ob_flush和flush的区别
Nov 27 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
May 15 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中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
详解PHP归并排序的实现
2016/10/18 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
原生js实现日期联动
2015/01/12 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
Vue实现固定定位图标滑动隐藏效果
2019/05/30 Javascript
vue 导航内容设置选中状态样式的例子
2019/11/01 Javascript
Postman环境变量全局变量使用方法详解
2020/08/13 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
Python 解析XML文件
2009/04/15 Python
Centos5.x下升级python到python2.7版本教程
2015/02/14 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
python安装教程
2018/02/28 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
一个入门级python爬虫教程详解
2021/01/27 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
英国标志性奢侈品牌:Burberry
2016/07/28 全球购物
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
汽车检测与维修个人求职信
2013/09/24 职场文书
客服工作职责
2013/12/11 职场文书
语文教学感言
2014/02/06 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
微信小程序和php的登录实现
2021/04/01 PHP