首页PHP文章详情

ThinkPHP6设置session不生效的原因和解决方案

By lakeui / Jan 1, 2021 阅读 0 评论 0 发表于 PHP 字数:1614 阅读时间:17秒

tp6thinkphp6session

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

目录

1. tp6 session设置不生效

TP6 默认是关闭SESSION,需要在项目中间件或者全局中间件中打开

找到 app/middleware.php 文件添加如下代码:

  1. <?php
  2. // 全局中间件定义文件
  3. return [
  4. // 全局请求缓存
  5. // \think\middleware\CheckRequestCache::class,
  6. // 多语言加载
  7. // \think\middleware\LoadLangPack::class,
  8. // Session初始化
  9. \think\middleware\SessionInit::class
  10. ];

或者在项目文件夹下的 app/admin/middleware.php 添加以下代码:

  1. <?php
  2. return [
  3. \think\middleware\SessionInit::class
  4. ];

但thinkphp6中有个session的设置有一个特殊情况,那就是不能在你设置session的方法中使用exit或者die操作,否则session无法生效,我就是因为在设置session时,代码最后使用了exit进行返回操作json,导致无法生效,这点要注意。

  1. //session不生效的代码
  2. function success($data=[],$msg=''){
  3. $code = ErrorCode::SUCCESS;
  4. $msg = !empty($msg)?$msg:ErrorCode::getError($code);
  5. exit(json_encode([
  6. 'code'=>$code,
  7. 'message'=>$msg,
  8. 'datas'=>$data
  9. ]));
  10. }
  11. //修改后的代码
  12. function success($data=[],$msg=''){
  13. $code = ErrorCode::SUCCESS;
  14. $msg = !empty($msg)?$msg:ErrorCode::getError($code);
  15. echo(json_encode([
  16. 'code'=>$code,
  17. 'message'=>$msg,
  18. 'datas'=>$data
  19. ]));
  20. }

2. 在配置文件中设置为使用JSON序列化需要注意的问题

  1. //config/session.php
  2. <?php
  3. return [
  4. //....
  5. //新加
  6. 'serialize' => ['json_encode', 'json_decode'],
  7. ];

通过上面设置session序列化后,如果使用了验证码功能会出现验证码验证失败的问题。通过分析源码:

  1. //文件路径:vendor/topthink/think-captcha/src/Captcha.php
  2. /**
  3. * 验证验证码是否正确
  4. * @access public
  5. * @param string $code 用户验证码
  6. * @return bool 用户验证码是否正确
  7. */
  8. public function check(string $code): bool{
  9. if (!$this->session->has('captcha')) {
  10. return false;
  11. }
  12. $key = $this->session->get('captcha.key');
  13. $code = mb_strtolower($code, 'UTF-8');
  14. $res = password_verify($code, $key);
  15. if ($res) {
  16. $this->session->delete('captcha');
  17. }
  18. return $res;
  19. }

可以知道获取存在session中的验证码代码为:

  1. $key = $this->session->get('captcha.key');

这样获取到的key为空,需要修改为:

  1. $key = $this->session->get('captcha')->key;

这样才能确保获取到存在session中验证码。

这里官方不建议把对象存在session中,也不建议修改验证码的源码

手机扫码阅读,舒服~

⌘ + Return 发表
最新 最早 全部评论0 条评论