• 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

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

    博客园这边,我会定期批量发布文章,如果想要实时看到最新的文章,欢迎关注微信公众号"决胜机器学习",里面有我最新的文章。linhxx
  • 相关阅读:
    POJ 1502 MPI Maelstrom
    BNUOJ4359 无爱编号
    BNUOJ 6727 Bone Collector
    SAP成都研究院郑晓霞:Shift Left Testing和软件质量保证的一些思考
    聊聊C语言和ABAP
    小技巧:不用任何媒体处理软件进行视频压缩
    如何处理Docker错误消息:please add——insecure-registry
    如何处理Docker的错误消息request canceled:Docker代理问题
    推荐一个高大上的网易云音乐命令行播放工具:musicbox
    Windows下使用python库 curses遇到错误消息的解决方案
  • 原文地址:https://www.cnblogs.com/linhxx/p/8412904.html
Copyright © 2020-2023  润新知