Session

IMI 的 Http Session 目前内嵌支持文件和 Redis 两种存储方式,当然你也可以自行扩展更多存储方式。

如果想要启用 Session,需要在配置文件中进行设置。

配置

在服务器配置文件中:

  1. return [
  2. 'beans' => [
  3. 'SessionManager' => [
  4. // 指定 Session 存储驱动类
  5. 'handlerClass' => \Imi\Server\Session\Handler\File::class,
  6. ],
  7. 'SessionConfig' => [
  8. // session 名称,默认为imisid
  9. 'name' => 'imisid',
  10. // 每次请求完成后触发垃圾回收的概率,默认为1%,可取值0~1.0,概率为0%~100%
  11. 'gcProbability' => 0.01,
  12. // 最大存活时间,默认30天,单位秒
  13. 'maxLifeTime'=> 86400 * 30,
  14. // session 前缀
  15. 'prefix' => null,
  16. ],
  17. 'SessionCookie' => [
  18. // Cookie 的 生命周期,以秒为单位。
  19. 'lifetime' => 0,
  20. // 此 cookie 的有效 路径。 on the domain where 设置为“/”表示对于本域上所有的路径此 cookie 都可用。
  21. 'path' => '/',
  22. // Cookie 的作用 域。 例如:“www.php.net”。 如果要让 cookie 在所有的子域中都可用,此参数必须以点(.)开头,例如:“.php.net”。
  23. 'domain' => '',
  24. // 设置为 TRUE 表示 cookie 仅在使用 安全 链接时可用。
  25. 'secure' => false,
  26. // 设置为 TRUE 表示 PHP 发送 cookie 的时候会使用 httponly 标记。
  27. 'httponly' => false,
  28. ],
  29. // 配置中间件
  30. 'HttpDispatcher' => [
  31. 'middlewares' => [
  32. // Session 中间件
  33. \Imi\Server\Session\Middleware\HttpSessionMiddleware::class,
  34. ],
  35. ],
  36. ],
  37. ];

其中每一种存储方式还有特别的配置项,请看下文。

文件

服务器配置文件->beans中加入:

  1. 'beans' => [
  2. 'SessionFile' => [
  3. 'savePath' => 'Session文件存储路径',
  4. ]
  5. ]

文件 Session 未来不支持分布式,推荐使用 Redis!

Redis

  1. 'beans' => [
  2. 'SessionRedis' => [
  3. // Redis连接池名称
  4. 'poolName' => '',
  5. // Redis中存储的key前缀,可以用于多系统session的分离
  6. // 'keyPrefix' => 'imi.',
  7. ]
  8. ]

Session 存储序列化方式配置

根据你选用的存储驱动类,配置在对应的节里,下面以文件驱动演示

  1. 'beans' => [
  2. 'SessionFile' => [
  3. 'formatHandlerClass' => \Imi\Util\Format\PhpSerialize::class,
  4. ]
  5. ]

可以选用的序列化类:

JSON:\Imi\Util\Format\Json::class

PHP序列化:\Imi\Util\Format\PhpSerialize::class

PHP Session 序列化:\Imi\Util\Format\PhpSession::class (兼容 php-fpm 默认的 Session 存储格式)

使用

引入 Session 类

  1. use Imi\Server\Session\Session;

读取

  1. // 获取值
  2. Session::get('aaa');
  3. // 获取值,如果不存在则返回默认值
  4. Session::get('aaa', 'default value');
  5. // 获取$session['a']['b']的值
  6. Session::get('a.b');
  7. // 获取$session[前缀]['aaa']的值,前缀在配置文件中设置
  8. Session::get('@.aaa');

写入

  1. Session::set($name, $value)

删除

  1. Session::delete($name)

读取并删除

  1. Session::once($name, $default = false)

清空

  1. Session::clear();

自定义 Session ID 获取方式

config.php:

  1. [
  2. 'beans' => [
  3. \Imi\Server\Session\Middleware\HttpSessionMiddleware::class => [
  4. 'sessionIdHandler' => function(\Imi\Server\Http\Message\Request $request){
  5. // 举例,比如希望从 header 中获取
  6. return $request->getHeaderLine('X-Session-ID');
  7. },
  8. ],
  9. ],
  10. ]