Session
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
数据是序列化后保存的,默认采用serialize
/unserialize
方式保存,你可以自定义序列化保存的方式,例如:
'serialize' => ['json_encode', 'json_decode'],
默认使用文件方式写入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
写入失败。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。