Redis专题(十)——Redis存储Session

Redis专题(十) ——Redis存储session

(原创内容,转载请注明来源,谢谢)

一、概述

PHP默认是将session存于服务器的文件中。当并发量大,此方式效率低,因此可以采用redis存储session。

要改变session的存储位置,首先要改变php.ini中的配置项session.save_handler,将其值设置为user。

二、改变存储位置函数

php内置的函数session_set_save_handler可以重新设定session的保存方式,包括session的打开、关闭、写入、读取等。

session_set_save_handler方法实质上不仅实现存储位置由文件变为redis(或其他用户定义的存储类型如memcache),还需要自定义session被打开、关闭、设置、读取、销毁、回收等情况下,php具体去执行的内容。因此,该方法传入的变量全是回掉函数。

该方法的具体内容,在php官方文档中,定义如下:

boolsession_set_save_handler ( callable $open , callable $close , callable $read ,callable $write , callable $destroy , callable $gc [, callable $create_sid [,callable $validate_sid [, callable $update_timestamp ]]] )

具体定义如下:

1、open

当session被打开时,会自动调用此函数。类似于类的构造函数。

2、close

当session关闭时调用的函数,类似于析构函数。

3、read

如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 如果会话中没有数据,read回调函数返回空字符串。

其中,存储在session的内容如果是数组、对象,必须序列化后存储,而session调用此函数后会自动将值进行反序列化。

4、write

当要保存session数据时,当前会话 ID 以及 $_SESSION 中数据序列化之后的字符串作为参数。序列化后的数据将和会话 ID 关联在一起进行保存。当调用 read 回调函数获取数据时,所返回的数据必须要和传入 write 回调函数的数据完全保持一致。

5、destroy

调用session_destroy时会调用此函数。

6、gc

会话回收清理旧数据时调用的内容。

7、create_id

当需要重新生成新的会话id时调用的函数。

三、PHP实现session存储于redis

         <?php
//类的功能——实现将session存储在redis
class SessionSaveRedis{
         private $redis;
         private $sessionPath;
         private $sessionName;
         private$sessionExpireTime = 100;
         //构造函数,连接redis
         public function__construct(){
                   $this->redis= new Redis();
                   $this->redis->connect('127.0.0.1',6379);
                   $this->loadSession();
                   session_start();
         }
         //加载自定义session方法
         public functionloadSession(){
                   session_set_save_handler(
                            array($this,'open'),
                            array($this,'close'),
                            array($this,'read'),
                            array($this,'write'),
                            array($this,'destroy'),
                            array($this,'gc')
                   );
         }
         public functionopen($path, $name){
                   return true;
         }
         public functionclose(){
                   return true;
         }
         //存入redis时,key采用session:id,
//便于统一管理所有的session,与redis中存储的其他内容作为区分
         public functionread($id){
                   $value =$this->redis->get('session:' . $id);
                   if($value){
                            return$value;
                   }else{
                            return'';
                   }
         }
         public functionwrite($id, $data){
                   if($this->redis->set('session:'. $id, $data)){
                            $this->redis->expire('session:'. $id, $this->sessionExpireTime);
                            returntrue;
                   }
                   returnfalse;
         }
         public functiongc($time){
                   return true;
         }
         public function__destruct(){
                   session_write_close();
         }
}

——written by linhxx 2017.08.14

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法channel

面试被问到动态内存分配时需要注意哪些坑,该怎么回答?

面试时,面试官问我们Java,Python这种语言那是必须要准确回答的,很多系统如果对性能要求高的话,底层一般会用到C/C++语言,因此被问到底层语言的相关知识...

973
来自专栏决胜机器学习

设计模式专题(十七) ——单例模式

设计模式专题(十七)——单例模式 (原创内容,转载请注明来源,谢谢) 一、概述 单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访...

2987
来自专栏Ryan Miao

redis学习之二from github

大概敲了一遍基本命令,熟悉了redis的存储方式。现在开始进一步系统的学习。学习教程目前计划有三个,一个是github上的https://github.com/...

2696
来自专栏韩伟的专栏

框架设计原则和规范(完)

祝大家圣诞节快乐!有事没事别出门,外面太!挤!了! 此文是《.NET:框架设计原则、规范》的读书笔记,本文内容较多,共分九章,今天推送最后一章。 1. 什么是好...

2584
来自专栏林德熙的博客

dotnet 设计规范 · 抽象类

X 不要定义 public 或 protected internal 访问的构造函数。默认 C# 语言不提供抽象类的公开构造函数方法。

242
来自专栏MyBlog

Effective Java 读书笔记(7)避免finalizer

对于Finalizers他们的使用可能会造成错误的产生,糟糕的性能以及移植性的问题,当然Finalizers有着一些有用的优点,我们会在后续介绍这些,但是作为首...

732
来自专栏IMWeb前端团队

nodejs中错误捕获的一些最佳实践

本文作者:IMWeb yisbug 原文出处:IMWeb社区 未经同意,禁止转载 本文内容大部分来自 https://www.joyent.com/...

1846
来自专栏架构说

缓存策略之LRU实现及分析

LRU定义 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间...

29910
来自专栏欧阳大哥的轮子

深入解构iOS系统下的全局对象和初始化函数

事件源于接入了一个第三方库导致应用出现了大量的crash记录,很奇怪的是这么多的crash居然没有收到用户的反馈信息! 在这个过程中每个崩溃栈的信息都明确的指向...

702
来自专栏程序小工

【实战】Tp5+小程序(一)--数据库访问与ORM

ThinkPHP5 从入门到深入学习,结合实战项目深入理解 ThinkPHP5 的特性和使用方法,了解 ThinkPHP5 的数据库访问和 ORM 思想,学习使...

792

扫描关注云+社区