6.0版本的Session机制完全重写了,并且不再使用PHP内置的Session机制,全新实现一套Session机制,可以更好的支持Swoole/Workerman等环境。
所以不再支持PHP内置的session_*** 系列函数,也不再支持使用$_SESSION读取session数据,你必须通过框架提供的Session类或者门面来操作,Request类也封装了Session数据的读取。
开启Session
Session默认安装是关闭的,因为API接口应用通常并不需要使用Session,如果你的应用使用了Session,必须在app\middleware.php文件中开启SessionInit全局中间件。
return [
\think\middleware\SessionInit::class,
...
];
当然,如果你是多应用模式,并且只有index应用使用了Session的话,可以只需要在app\index\middleware.php中开启SessionInit全局中间件。
SessionInit中间件会获取当前用户的sessionId,并存入Cookie。而Session数据的写入则是在HTTP请求结束的时候统一写入,而非实时写入。所以不要在Session写入后进行任何的中断执行操作,可能会导入Session写入失败。
Session配置文件为session.php,用于定义session类型及相关参数。
基本操作
基本的Session操作如下(这里使用了门面方式)
// 设置session
Session::set('name', 'value');
// 判断session
Session::has('name');
// 获取Session
Session::get('name');
// 获取全部数据
Session::all();
// 获取并删除数据
Session::pull('name');
// 删除Session
Session::delete('name');
// 清空session
Session::clear();
Session数据会自动序列化保存。
Session有效期
Session有效期可以通过配置文件的expire参数来设置,默认为1440(秒),如果设置了过期时间的话,是精准可控的,例如你设置了
'expire' => 30,
表示30秒Session过期,你打开页面后,不做任何操作30秒之后再刷新,Session就会过期。
不要把有效期设置为0,否则Session会实时失效。
跨应用
如果你使用的是多应用模式,无论使用的是什么驱动,默认情况下,Session都是支持跨应用的。但如果你要保持每个应用独立,可以在应用的session.php配置文件中设置prefix参数确保独立。
'prefix' => 'admin'
Session序列化
session数据是序列化后保存的,默认采用serialize/unserialize方式保存,你可以自定义序列化保存的方式,例如:
'serialize' => ['json_encode', 'json_decode'],
Session类型
默认使用文件方式写入Session,保存路径位于runtime/session目录下面(可以自定义路径),并支持GC机制。除了文件方式写入外,还可以支持直接使用缓存作为Session类型,例如:
return [
'type' => 'cache',
'store' => 'redis',
'prefix' => 'think',
];
表示使用redis缓存作为session类型。这样设计的优势是Session驱动和缓存驱动不需要重复定义,连配置都可以复用,因此除了文件方式之外,Session和缓存的驱动其实是公用的。
要以上的配置生效,请确保缓存配置文件cache.php中的stores中已经添加了redis缓存配置,例如:
return [
'default' => 'file',
'stores' => [
// 文件缓存
'file' => [
// 驱动方式
'type' => 'file',
// 设置不同的缓存保存目录
'path' => '../runtime/file/',
],
// redis缓存
'redis' => [
// 驱动方式
'type' => 'redis',
// 服务器地址
'host' => '127.0.0.1',
],
],
];
其它注意事项
Session数据的保存不是实时的,是在当前Http请求结束的时候统一写入,所以如果你在Session设置后使用了die或者exit则会导入Session写入失败。
发表评论