Blogger Information
Blog 128
fans 9
comment 5
visits 241302
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
17.【TP6学习笔记】Session的开启赋值取值删除清空等操作
 一纸荒凉* Armani
Original
2680 people have browsed it

Session的使用

可以直接使用think\facade\Session类操作Session

新版本不支持操作原生$_SESSION数组和所有session_开头的函数,只能通过Session类(或者助手函数)来操作。会话数据统一在当前请求结束的时候统一写入 所以不要在session写入操作之后执行exit等中断操作,否则会导致Session数据写入失败。

6.0Session类可以很好的支持诸如Swoole/Workerman等环境。

开启Session

Session功能默认是没有开启的(API应用通常不需要使用Session),如果你需要使用Seesion,需要在全局的中间件定义文件中加上下面的中间件定义:

'think\middleware\SessionInit'

如果是多应用模式,并且你只是用于部分应用,那么也可以在应用中间件定义文件中单独开启。

Session初始化

系统会自动按照session.php配置的参数自动初始化Session

默认支持的session设置参数包括:

参数描述
typesession类型(File或者Cache
store当type设置为cache类型的时候指定存储标识
expiresession过期时间(秒)必须大于0
var_session_id请求session_id变量名
namesession_name
prefixsession前缀
serialize序列化方法

无需任何操作就可以直接调用Session类的相关方法,例如:

Session::set('name', 'thinkphp');Session::get('name');

会话数据保存(请求结束)的时候会自动序列化,并在读取的时候自动反序列化,默认使用serialize/unserialize进行序列化操作,你可以自定义序列化机制。

例如在配置文件中设置为使用JSON序列化:

'serialize'    =>    ['json_encode', 'json_decode'],

尽量避免把对象保存到Session会话

基础用法

赋值

Session::set('name', 'thinkphp');

判断是否存在

Session::has('name');

取值

// 如果值不存在,返回nullSession::get('name');// 如果值不存在,返回空字符串Session::get('name', '');// 获取全部数据Session::all();

删除

Session::delete('name');

取值并删除

// 取值并删除Session::pull('name');

如果name的值不存在,返回Null

清空

Session::clear();

闪存数据,下次请求之前有效

// 设置session 并且在下一次请求之前有效Session::flash('name','value');

提前清除当前请求有效的数据

// 清除当前请求有效的sessionSession::flush();

注意,Session写入数据的操作会在请求结束的时候统一进行本地化存储,所以不要在写入Session数据之后使用exit等中断操作,可能会导致Session没有正常写入。

多级数组

支持session的多级数组操作,例如:

// 赋值Session::set('name.item','thinkphp');// 判断是否赋值Session::has('name.item');// 取值Session::get('name.item');// 删除Session::delete('name.item');

其中setdelete方法只能支持二级数组,其他方法支持任意级数组操作。

助手函数

系统也提供了助手函数session完成相同的功能,例如:

// 赋值session('name', 'thinkphp');// 判断是否赋值session('?name');// 取值session('name');// 删除session('name', null);// 清除sessionsession(null);

Request对象中读取Session

可以在Request对象中读取Session数据

public function index(Request $request) {    // 读取某个session数据    $request->session('user.name', '');    // 获取全部session数据    $request->session();}

Request类中不支持Session写入操作。

应用独立会话

多应用情况下默认Session是跨应用的,也就是说多应用之间是共享会话数据的,如果不希望共享会话数据,可以给每个应用设置不同的前缀prefix

如果是File类型的话,默认的session会话数据保存在runtime/session目录下面,你可以设置path改变存储路径。

Session驱动

默认的Session驱动采用文件缓存方式记录,并且支持如下配置

参数描述
pathsession保存路径
data_compress是否压缩数据
gc_divisorGC回收概率
gc_probabilityGC回收概率

除了文件类型之外,还可以支持直接使用缓存作为Session类型,例如:

return [    'type'       => 'cache',    'store'      => 'redis',    'prefix'     => 'think',]

表示使用redis作为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驱动,你的驱动类必须实现think\contract\SessionHandlerInterface接口,包含了三个方法。

interface SessionHandlerInterface{    public function read(string $sessionId): string;    public function delete(string $sessionId): bool;    public function write(string $sessionId, string $data): bool;}

read方法是在调用Session::start()的时候执行,并且只会执行一次。
write方法是在本地化会话数据的时候执行(调用Session::save()方法),系统会在每次请求结束的时候自动执行。
delete方法是在销毁会话的时候执行(调用Session::destroy()方法)。

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post