摘要:新版本不支持操作原生 $_SESSION 数组和所有 session_开头的函数,只能通过 Session 类(或者助手函数)来操作。会话数据统一在当前请求结束的时候统一写入 所以不要在 session 写入操作之后执行 exit 等中断操作,否则会导致 Session 数据写入失败。
目录
1. tp6 session设置不生效
TP6 默认是关闭SESSION,需要在项目中间件或者全局中间件中打开
找到 app/middleware.php 文件添加如下代码:
<?php// 全局中间件定义文件return [// 全局请求缓存// \think\middleware\CheckRequestCache::class,// 多语言加载// \think\middleware\LoadLangPack::class,// Session初始化\think\middleware\SessionInit::class];
或者在项目文件夹下的 app/admin/middleware.php 添加以下代码:
<?phpreturn [\think\middleware\SessionInit::class];
但thinkphp6中有个session的设置有一个特殊情况,那就是不能在你设置session的方法中使用exit或者die操作,否则session无法生效,我就是因为在设置session时,代码最后使用了exit进行返回操作json,导致无法生效,这点要注意。
//session不生效的代码function success($data=[],$msg=''){$code = ErrorCode::SUCCESS;$msg = !empty($msg)?$msg:ErrorCode::getError($code);exit(json_encode(['code'=>$code,'message'=>$msg,'datas'=>$data]));}//修改后的代码function success($data=[],$msg=''){$code = ErrorCode::SUCCESS;$msg = !empty($msg)?$msg:ErrorCode::getError($code);echo(json_encode(['code'=>$code,'message'=>$msg,'datas'=>$data]));}
2. 在配置文件中设置为使用JSON序列化需要注意的问题
//config/session.php<?phpreturn [//....//新加'serialize' => ['json_encode', 'json_decode'],];
通过上面设置session序列化后,如果使用了验证码功能会出现验证码验证失败的问题。通过分析源码:
//文件路径:vendor/topthink/think-captcha/src/Captcha.php/*** 验证验证码是否正确* @access public* @param string $code 用户验证码* @return bool 用户验证码是否正确*/public function check(string $code): bool{if (!$this->session->has('captcha')) {return false;}$key = $this->session->get('captcha.key');$code = mb_strtolower($code, 'UTF-8');$res = password_verify($code, $key);if ($res) {$this->session->delete('captcha');}return $res;}
可以知道获取存在session中的验证码代码为:
$key = $this->session->get('captcha.key');
这样获取到的key为空,需要修改为:
$key = $this->session->get('captcha')->key;
这样才能确保获取到存在session中验证码。
这里官方不建议把对象存在session中,也不建议修改验证码的源码
手机扫码阅读,舒服~


