Redis 接管 Session

在多台服务器中,会遇到 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。

  • 使用单个 redis 和使用集群,初始化对象时不一样

    • 单个redis
    $redis = new Redis();
    $redis->connect('xxxxxx', 6379);
    
    • redis 集群
    $hosts = [
      'xxxxxxxxxx-001.iuuotc.0001.apne1.cache.amazonaws.com:6379'
      , 'xxxxxxxxxx-002.iuuotc.0001.apne1.cache.amazonaws.com:6379'
    ];
    $redis = new RedisCluster(NULL, $hosts);
    
  • 把之前用到 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

    如果连接集群,则加上-c参数,用于多个节点重定向,避免报错

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

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



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

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

posted @ 2023-01-17 16:35  菜乌  阅读(141)  评论(0编辑  收藏  举报