首页 > 数据库 >Redis 接管 Session

Redis 接管 Session

时间:2023-01-17 16:45:48浏览次数:55  
标签:session return 接管 redis Session phpredis Redis php id

在多台服务器中,会遇到 Session 共享的问题。

之前用的实体服务器,都在同一局域网,很好解决。

但是迁移到 AWS 服务器后,不再满足同一局域网。

决定用 ElastiCache Redis 来管理 Session。


安装 phpredis 扩展

  • 在不重新编译 PHP 的前提下,用 phpize 来安装扩展

  • 在 PHP 的安装包目录下 ext/ 目录中找到 phpredis 包,没有则自己下载

  • 下载安装步骤如下,过程中记录 redis.so 文件的位置(各个目录对应修改成自己的目录)

# cd /usr/local/src/php-8.1.13/
# wget https://github.com/phpredis/phpredis/archive/refs/tags/5.3.7.tar.gz
# tar -zxvf 5.3.7.tar.gz
# mv phpredis-5.3.7 ext/
# cd ext/phpredis-5.3.7/
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make
# make install

修改 php.ini

  • 修改 session 处理方式
    session.save_handler = files => session.save_handler = redis

  • 注释掉之前的保存路径
    ;session.save_path = "/usr/xxxxxx/session"

  • 添加 redis 扩展,记入安装的 redis.so 路径
    extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20210902/redis.so


重启服务

  • 重启 Nginx
    systemctl restart nginx

  • 重启 php-fpm
    systemctl restart php-fpm


改代码

  • session_set_save_handler()方法自定义 session 处理方式。

  • 在下面的 read、write、destroy 方法中把默认的 session 方式换成 redis。

  • 把之前用到 session 的地方,都引入下面的代码即可

  • 参考

$redis = new Redis();

$redis->connect('xxxxxx', 6379);

//$redis->auth('');

function open($path, $name) {
        return true;
}

function close() {
        return true;
}

function read($id) {
        global $redis;

        $value = $redis->get($id);

        if (! is_null($value)) {
                $value = '';
        }

        return $value;
}

function write($id, $data) {
        global $redis;

        if ($redis->set($id, $data)) {
                $redis->expire($id, 300); //300s

                return true;
        }

        return false;
}

function destroy($id) {
        global $redis;

        if ($redis->delete($id)) {
                return true;
        }

        return false;
}

function gc($maxlifetime) {
        return true;
}

session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');

session_start();

$_SESSION['test'] = '20230117test';

//echo $_SESSION['test'];

确认

  • 安装 redis-cli(安装 redis 自带 redis-cli,或者只安装客户端),我这里用远程 redis,所以只安装客户端。

  • redis-cli 命令连到 redis 中。当然如果是本地 redis 的话,请先启动服务。
    redis-cli -h xxxxxx -p 6379

  • 执行上面的代码后,查看 redis 内容
    xxxxxx:6379> keys *

  • 根据上一步查到的 id 查看具体内容
    xxxxxx:6379> get xxxidxxx



用上面的方式,不需要大批量修改之前代码中所用的 session 方法,只要引入上面的代码即可。

减少了工作量,也缩小了影响范围。

标签:session,return,接管,redis,Session,phpredis,Redis,php,id
From: https://www.cnblogs.com/rendd/p/17058137.html

相关文章

  • Django Session 原理及配置和使用
    1、Django如何使用session会话1.1)session会话是通过中间件实现的,所以首先需要配置MIDDLEWAREMIDDLEWARE=[......'django.contrib.sessions.middleware.SessionM......
  • redis占用内存过高怎么办???
    运维排查篇|Redis占用内存过高怎么办?原创 咸鱼不想秃头 咸鱼爱搞机 2022-09-1921:40 发表于上海前言 我们知道,Redis是一个key-value数据库,它的数据是运行......
  • 使用管控平台管理redis集群
    1添加redis集群在数据库资源中添加redis集群,配置参数并将URL中cluster调整为true。2验证配置资源是否正常3操作redis数据库中的数据可以通过使用图形化界面或者命......
  • Servlet6 - Session保存作用域
    session的保存作用域向当前session保存作用域保存一个键值对数据HttpSessionsession=request.getSession();session.setAttribute(key,value);sessionID相同......
  • Servlet5 - Session介绍
    SessionHTTP无状态:服务器无法判断两次请求是否为同一个客户端发送的无状态的现实问题:第一次请求添加商品到购物车,第二次请求结账,如果不能判断是同一个用户就会导致混乱......
  • [ 2--Redis相关学习 | 青训营笔记]
    这是我参与「第五届青训营」伴学笔记创作活动的第2天官方教程GolangRedisClient|TheHomeofRedisDevelopers简介REmoteDIctionaryServer(Redis)是一个由......
  • 探讨下如何更好的使用缓存 —— Redis缓存的特殊用法以及与本地缓存一起构建多级缓存
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。通......
  • 网络协议-session+cookie
    (1)当客户端PC的浏览器第一次访问某个web站点资源时,客户端提交没有带SessionID的请求(请求报文头没有Cookie头域信息)。而web服务器会检查是否有SessionID过来,没有则创建Sess......
  • 分析HttpServletRequest的sessionId不一致的原因
    事情是这样的:在接口①存入session,接着在接口②获取session,结果:同一个key,却打印为空!!!为何不同?一、从session的原理上来看:session的工作原理就是依靠cookie来做支撑,第一次使用r......
  • Redis 缓存和 MySQL 如何实现数据一致性
    需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库。......