redis使用基础 ——Redis存储Session

Posted lin_h

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis使用基础 ——Redis存储Session相关的知识,希望对你有一定的参考价值。

redis使用基础(十)

——Redis存储Session

 

(转载请附上本文链接——linhxx)

 

一、概述

         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官方文档中,定义如下:

bool session_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 function loadSession(){

                   session_set_save_handler(

                            array($this, \'open\'),

                            array($this, \'close\'),

                            array($this, \'read\'),

                            array($this, \'write\'),

                            array($this, \'destroy\'),

                            array($this, \'gc\')

                   );

         }

         public function open($path, $name){

                   return true;

         }

         public function close(){

                   return true;

         }

         //存入redis时,key采用session:id,

//便于统一管理所有的session,与redis中存储的其他内容作为区分

         public function read($id){

                   $value = $this->redis->get(\'session:\' . $id);

                   if($value){

                            return $value;

                   }else{

                            return \'\';

                   }

         }

         public function write($id, $data){

                   if($this->redis->set(\'session:\' . $id, $data)){

                            $this->redis->expire(\'session:\' . $id, $this->sessionExpireTime);

                            return true;

                   }

                   return false;

         }

         public function gc($time){

                   return true;

         }

         public function __destruct(){

                   session_write_close();

         }

}

 

四、使用方式

         假设读、写session和定义SessionSaveRedis类分别在三个php文件中,方法如下:

1、写session

         include(\'SessionSaveRedis.php\');

new SessionSaveRedis();

$_SESSION[\'test\'] = \'a\';

2、读session

include(\'SessionSaveRedis.php\');

new SessionSaveRedis();

$_SESSION[\'test\'];

 

 

——written by linhxx

 

更多最新文章,欢迎关注微信公众号“决胜机器学习”,或扫描右边二维码。

以上是关于redis使用基础 ——Redis存储Session的主要内容,如果未能解决你的问题,请参考以下文章

redis基础命令

#yyds干货盘点# Redis概念和基础

session存入redis中

2.redis概述

windows下使用redis,Redis入门使用,Redis基础命令

redis入门基础