欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用redis存储PHP session

程序员文章站 2024-03-20 13:17:46
...

PHP自带的session是文件格式存储,不利于高并发访问,所以将PHP原生的session改为redis存储。

文章方法转自不知名的大神,并自己做了写总结和修改

1 在php.ini文件中修改PHP session的默认存储方式,将文件存储修改为会话存储

#session.save_handler=file
session.save_handler = user

2 写调用redis的方法类

主要使用session_set_save_handler方法设置用户自定义会话并存储数据。

<?php
    class SessionManager
    {
        private $redis;
        private $session_expire_time = 3600;

        public function __construct()
        {
            //连接redis数据库
            $this->redis = new Redis();
            $this->redis->connect('127.0.0.1',6379) || die('连接redis服务器失败');
            //$this->redis->auth('password');
            $this->redis->select(0); //选择0号数据库

            //设置用户自定义会话存储函数
            session_set_save_handler(
                array($this,"open"),
                array($this,"close"),
                array($this,"read"),
                array($this,"write"),
                array($this,"destroy"),
                array($this,"gc")
            );
            session_start();
        }

        //open回调函数类似于类的构造函数,在会话打开的时候会被调用。
        //是自动开始会话或者通过调用session_start()后第一个被调用的回调函数
        //回调函数成功返回TRUE
        public function open(){
            return TRUE;
        }

        //类似于析构函数的回调函数
        //在write回调函数调用之后调用
        //当调用session_write_close()函数之后返回TRUE
        public function close(){
            return TRUE;
        }

        //如果会话中有数据,将返回序列化字符串
        //无数据则返回空字符串
        //自动开始会话或调用session_start()后,
        //通过该函数返回值填充$_seesion函数
        public function read($id){
            $value = $this->redis->get($id);
            if($value){
                return $value;
            }else{
                return '';
            }
        }

        //保存会话数据时调用
        //会将$_SESSION中的值填充到redis中
        public function write($id,$data){
            if($this->redis->set($id,$data)){
                $this->redis->expire($id,$this->session_expire_time);
                return TRUE;
            }else{
                return FALSE;
            }
        }

        //使用session_destoy()函数时调用
        public function destroy($id){
            if($this->redis->delete($id)){
                return TRUE;
            }else{
                return FALSE;
            }
        }

        //垃圾回收函数
        //会不定时的清理
        public function gc(){
            return TRUE;
        }

        public function __destruct()
        {
            // TODO: Implement __destruct() method.
            session_write_close();
        }
    }

?>

3 使用上述类的方法,通过session自带的方法可以使用函数。

new SessionManager();
$_SESSION['username'] = "user";
echo $_SESSION['username'];
session_destroy();

4 测试验证

首先,不使用该类,使用自带的session,

可以在/var/lib/php/session文件夹中可以读取到session文件;

其次,使用redis存储session的方法,打开redis-cli查询,并比较/var/lib/php/session中文件,

可以发现,调用redis方法时,/var/lib/php/session中文件不增加,仅在redis数据库中出现数据。