随着业务量的增加,很多时候会需要共享session的情况。共享session,其实就是说多台服务器共用一个session,或者是说一个主域跟多个子域之间共用一个session。工作中用tp也多一些,那么,我就用tp6来给大家讲解一下。
在共享session,我们需要用到redis。这儿我假设大家都能读懂redis,并且也能安装和配置。
1、在 config 目录下的 cache.php 文件中,修改为如下代码
<?php
// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------
return [
// 默认缓存驱动
'default' => env('cache.driver', 'session'), //小冰 (这儿改为 session)
// 缓存连接方式配置
'stores' => [
'file' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => '',
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
// 缓存标签前缀
'tag_prefix' => 'tag:',
// 序列化机制 例如 ['serialize', 'unserialize']
'serialize' => [],
],
// 更多的缓存连接
//小冰 主要的在这儿,其实这个就是redis的配置
'session' => [
// 缓存主机
'host' => '127.0.0.1',
// 缓存端口
'port' => '6379',
// 缓存密码
'password' => '',
// 缓存数据库
'select' => '10',
// 缓存有效期 0表示永久缓存
'timeout' => 0,
// 缓存前缀
'prefix' => '',
'type' => 'redis'
],
],
//当然,这儿也还可以再写其他的缓存配置
];
2、修改session.php的配置文件 (在 config 目录下的 session.php 文件中)
<?php
// +----------------------------------------------------------------------
// | 会话设置
// +----------------------------------------------------------------------
return [
// session name
'name' => 'PHPSESSID',
// SESSION_ID的提交变量,解决flash上传跨域
'var_session_id' => '',
// 驱动方式 支持file cache
'type' => 'cache', //小冰 记住这儿为cache
// 存储连接标识 当type使用cache的时候有效
'store' => 'session', //小冰这儿填写session
// 过期时间
'expire' => 1440,
// 前缀
'prefix' => '',
];
到这儿,配置就已完成了。下面就是实际使用。
3、设置session的内容
在控制器中,我们首先需要引入session的类
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Session;
use think\facade\Cache;
class Test extends BaseController{
private $sessionRedis;
public function __construct(){
//new \think\cache\driver\Redis(config('cache.stores.session')) 表示引入redis类
$this->sessionRedis = new \think\cache\driver\Redis(config('cache.stores.session')); //引入redis类
}
public function testSession(){
session('key' , 'xiaoming');
}
public function getSessionRedis(){
$session_id = Session::getId(); //获取sessionid
$n = $this->sessionRedis->get($session_id);
var_dump($n);
}
}
?>
当然,如果要实现多个子域之间共享session,那么就需要做一些小小的配置。(所谓子域共享,就是 www.xyz.com 跟 abc.xyz.com)是同一个主域
(1) 在php.ini中,做如下配置
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379" #不带密码
#session.save_path = "tcp://127.0.0.1:6379?auth=youpwd″ #带密码的
session.cookie_domain = tp6.bnc #把它设置成你的主域即可,设置之后别忘了重启服务
#参考 https://blog.csdn.net/qq_31659985/article/details/97948365?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-97948365-blog-116473625.235^v38^pc_relevant_sort_base2&spm=1001.2101.3001.4242.2&utm_relevant_index=4
#当然,如果你用的是宝塔,那就直接在宝塔上设置。
(2) 在你的php项目中,设置 session 和 cookie 的顶域为主域名。(以tp6 为例)
<?php
return [
// session name
'name' => 'PHPSESSID',
// SESSION_ID的提交变量,解决flash上传跨域
'var_session_id' => '',
// 驱动方式 支持file cache
'type' => 'cache',
// 存储连接标识 当type使用cache的时候有效
'store' => 'session',
// 过期时间
'expire' => 1440,
'domain' => 'tp6.bnc',
// 前缀
'prefix' => '',
];
?>
文章来源:https://www.toymoban.com/news/detail-482805.html
<?php
// +----------------------------------------------------------------------
// | Cookie设置
// +----------------------------------------------------------------------
return [
// cookie 保存时间
'expire' => 0,
// cookie 保存路径
'path' => '/',
// cookie 有效域名
'domain' => 'tp6.bnc',
// cookie 启用安全传输
'secure' => false,
// httponly设置
'httponly' => false,
// 是否使用 setcookie
'setcookie' => true,
// samesite 设置,支持 'strict' 'lax'
'samesite' => '',
];
经过上面的配置和修改,我们之后存session就能在主域和子域之间共享了。文章来源地址https://www.toymoban.com/news/detail-482805.html
到了这里,关于tp6用redis存储session的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!