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