Session

安装并启用

通过 Composer 安装 swoft/session 组件

  1. 在项目 composer.json 所在目录执行 composer require swoft/session
  2. Swoft\Session\Middleware\SessionMiddleware::class 中间件加入到全局中间件的配置文件 config/beans/base.php
    1. 'serverDispatcher' => [
    2. 'middlewares' => [
    3. \Swoft\Session\Middleware\SessionMiddleware::class,
    4. ]
    5. ],
  3. 配置好 swoft/redis 组件的连接池配置,此步骤具体可查阅 swoft/redis 组件的文档说明, Redis 驱动将会直接通过 @Inject() 注解注入 \Swoft\Redis\Redis 类用于操作

配置 Session

通过对 SessionManager bean 的配置实现对 Session 配置的变更,若 Session 配置不存在,对 ./config/beans/ 内任意一个配置文件添加以下配置即可

  1. // 注意Bean大小写
  2. 'sessionManager' => [
  3. 'class' => \Swoft\Session\SessionManager::class,
  4. 'config' => [
  5. 'driver' => 'redis',
  6. 'name' => 'SWOFT_SESSION_ID',
  7. 'lifetime' => 1800,
  8. 'expire_on_close' => false,
  9. 'encrypt' => false,
  10. 'storage' => '@runtime/sessions',
  11. ],
  12. ],

Config 配置项

  • driver
    类型:enum,可选值 (redis|file)
    Session 驱动,目前仅支持将 redis 驱动用于生产环境,file 驱动暂未实现 GC(垃圾回收)

  • name
    类型:string
    Session 键名,对应到用户端储存 Session 信息的 Cookies 的键名

  • lifetime
    类型:int
    Session 生命时长,单位为

  • expire_on_close
    类型:boolean
    在结束请求时立刻使当前 Session 过期

  • encrypt
    类型:boolean
    是否加密储存 Session 内容

  • storage
    类型:int
    Session 信息储存位置,仅在 file 驱动下生效

常见问题

Q: 每次的请求都产生了不同的 SessionID
A: 检查 Nginx 配置是否在反向代理时有将 Host Header 设置到反向代理的请求去,通常在设置反向代理的时候都会带上下列的 Header 项,以确保反向代理后获取到的信息是一致的

  1. proxy_set_header Host $host;
  2. proxy_set_header X-Real-IP $remote_addr;
  3. proxy_set_header REMOTE-HOST $remote_addr;
  4. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

其中 proxy_set_header Host $host; 就是将当前的域名也设置到反向代理的请求的 Header 上,请检查是否有设置,以确保 Cookies 上设置的 Host 是与当前访问域名是一致的