会话数据

IMI 中 WebSocket 服务中使用 Imi\ConnectContext 类对连接的会话数据进行管理。在整个连接的生命周期中都有效。

使用

  1. use Imi\ConnectContext;
  2. // 取值
  3. echo ConnectContext::get('name');
  4. echo ConnectContext::get('name', 'default value');
  5. // 赋值
  6. ConnectContext::set('name', 'value');
  7. // 获取所有数据
  8. $array = ConnectContext::getContext();
  9. // 使用回调并且自动加锁进行操作,回调用返回数据会保存进连接上下文
  10. ConnectContext::use(function($data){
  11. // 本方法体会在锁中执行
  12. var_dump($data); // 读取数据
  13. $data['aaa'] = 222;
  14. return $data; // 写入数据,不return也可以,就是不修改
  15. });

配置

ConnectContext 存储器

MemoryTable:

  1. 'beans' => [
  2. 'ConnectContextStore' => [
  3. 'handlerClass' => \Imi\Server\ConnectContext\StoreHandler\MemoryTable::class,
  4. ],
  5. 'ConnectContextMemoryTable' => [
  6. 'tableName' => 'connectContext', // tableName 你需要实现定义 MemoryTable,请查看相关章节
  7. 'dataEncode'=> 'serialize', // 数据写入前编码回调
  8. 'dataDecode'=> 'unserialize', // 数据读出后处理回调
  9. 'lockId' => null, // 非必设,因为如果用 MemoryTable,默认是用 MemoryTable 的 Lock
  10. ],
  11. ],

Redis:

  1. 'beans' => [
  2. 'ConnectContextStore' => [
  3. 'handlerClass' => \Imi\Server\ConnectContext\StoreHandler\Redis::class,
  4. ],
  5. 'ConnectContextRedis' => [
  6. 'redisPool' => 'redis', // Redis 连接池名称
  7. 'redisDb' => 0, // redis中第几个库
  8. 'key' => 'imi:connect_context', // 键
  9. 'heartbeatTimespan' => 5, // 心跳时间,单位:秒
  10. 'heartbeatTtl' => 8, // 心跳数据过期时间,单位:秒
  11. 'dataEncode'=> 'serialize', // 数据写入前编码回调
  12. 'dataDecode'=> 'unserialize', // 数据读出后处理回调
  13. 'lockId' => null, // 必设,需要用锁来防止数据错乱问题
  14. ],
  15. ],