session管理

例子

  1. <?php
  2. namespace app\controller;
  3. use support\Request;
  4. class User
  5. {
  6. public function hello(Request $request)
  7. {
  8. $name = $request->get('name');
  9. $session = $request->session();
  10. $session->set('name', $name);
  11. return response('hello ' . $session->get('name'));
  12. }
  13. }

通过$request->session(); 获得Workerman\Protocols\Http\Session实例,通过实例的方法来增加、修改、删除session数据。

注意:session对象销毁时会自动保存session数据,所以不要把$request->session()返回的对象保存在全局数组或者类成员中导致session无法保存。

获取所有session数据

  1. $session = $request->session();
  2. $all = $session->all();

返回的是一个数组。如果没有任何session数据,则返回一个空数组。

获取session中某个值

  1. $session = $request->session();
  2. $name = $session->get('name');

如果数据不存在则返回null。

你也可以给get方法第二个参数传递一个默认值,如果session数组中没找到对应值则返回默认值。例如:

  1. $session = $request->session();
  2. $name = $session->get('name', 'tom');

存储session

存储某一项数据时用set方法。

  1. $session = $request->session();
  2. $session->set('name', 'tom');

set没有返回值,session对象销毁时session会自动保存。

当存储多个值时使用put方法。

  1. $session = $request->session();
  2. $session->put(['name' => 'tom', 'age' => 12]);

同样的,put也没有返回值。

删除session数据

删除某个或者某些session数据时用forget方法。

  1. $session = $request->session();
  2. // 删除一项
  3. $session->forget('name');
  4. // 删除多项
  5. $session->forget(['name', 'age']);

另外系统提供了delete方法,与forget方法区别是,delete只能删除一项。

  1. $session = $request->session();
  2. // 等同于 $session->forget('name');
  3. $session->delete('name');

获取并删除session某个值

  1. $session = $request->session();
  2. $name = $session->pull('name');

效果与如下代码相同

  1. $session = $request->session();
  2. $value = $session->get($name);
  3. $session->delete($name);

如果对应session不存在,则返回null。

删除所有session数据

  1. $request->session()->flush();

没有返回值,session对象销毁时session会自动从存储中删除。

判断对应session数据是否存在

  1. $session = $request->session();
  2. $has = $session->has('name');

以上当对应的session不存在或者对应的session值为null时返回false,否则返回true。

  1. $session = $request->session();
  2. $has = $session->exists('name');

以上代码也是用来判断session数据是否存在,区别是当对应的session项值为null时,也返回true。

助手函数session()

2020-12-09 新增

webman提供了助手函数session()完成相同的功能。

  1. // 获取session实例
  2. $session = session();
  3. // 等价于
  4. $session = $request->session();
  5. // 获取某个值
  6. $value = session('key', 'default');
  7. // 等价与
  8. $value = session()->get('key', 'default');
  9. // 等价于
  10. $value = $request->session()->get('key', 'default');
  11. // 给session赋值
  12. session(['key1'=>'value1', 'key2' => 'value2']);
  13. // 相当于
  14. session()->put(['key1'=>'value1', 'key2' => 'value2']);
  15. // 相当于
  16. $request->session()->put(['key1'=>'value1', 'key2' => 'value2']);

配置文件

session配置文件在config/session.php,内容类似如下:

  1. use Webman\Session\FileSessionHandler;
  2. use Webman\Session\RedisSessionHandler;
  3. use Webman\Session\RedisClusterSessionHandler;
  4. return [
  5. // FileSessionHandler::class 或者 RedisSessionHandler::class 或者 RedisClusterSessionHandler::class
  6. 'handler' => FileSessionHandler::class,
  7. // handler为FileSessionHandler::class时值为file,
  8. // handler为RedisSessionHandler::class时值为redis
  9. // handler为RedisClusterSessionHandler::class时值为redis_cluster 既redis集群
  10. 'type' => 'file',
  11. // 不同的handler使用不同的配置
  12. 'config' => [
  13. // type为file时的配置
  14. 'file' => [
  15. 'save_path' => runtime_path() . '/sessions',
  16. ],
  17. // type为redis时的配置
  18. 'redis' => [
  19. 'host' => '127.0.0.1',
  20. 'port' => 6379,
  21. 'auth' => '',
  22. 'timeout' => 2,
  23. 'database' => '',
  24. 'prefix' => 'redis_session_',
  25. ],
  26. 'redis_cluster' => [
  27. 'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
  28. 'timeout' => 2,
  29. 'auth' => '',
  30. 'prefix' => 'redis_session_',
  31. ]
  32. ],
  33. 'session_name' => 'PHPSID', // 存储session_id的cookie名
  34. // === 以下配置需要 webman-framework>=1.3.14 workerman>=4.0.37 ===
  35. 'auto_update_timestamp' => false, // 是否自动刷新session,默认关闭
  36. 'lifetime' => 7*24*60*60, // session过期时间
  37. 'cookie_lifetime' => 365*24*60*60, // 存储session_id的cookie过期时间
  38. 'cookie_path' => '/', // 存储session_id的cookie路径
  39. 'domain' => '', // 存储session_id的cookie域名
  40. 'http_only' => true, // 是否开启httpOnly,默认开启
  41. 'secure' => false, // 仅在https下开启session,默认关闭
  42. 'same_site' => '', // 用于防止CSRF攻击和用户追踪,可选值strict/lax/none
  43. 'gc_probability' => [1, 1000], // 回收session的几率
  44. ];

注意 webman从1.4.0起更改了SessionHandler的命名空间,由原来的 use Webman\FileSessionHandler;
use Webman\RedisSessionHandler;
use Webman\RedisClusterSessionHandler;
改为
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;

有效期配置

当webman-framework < 1.3.14时,webman中session过期时间需要在php.ini配置。

  1. session.gc_maxlifetime = x
  2. session.cookie_lifetime = x
  3. session.gc_probability = 1
  4. session.gc_divisor = 1000

假设设定有效期为1440秒,则配置如下

  1. session.gc_maxlifetime = 1440
  2. session.cookie_lifetime = 1440
  3. session.gc_probability = 1
  4. session.gc_divisor = 1000

提示 可使用命令 php --ini 来查找php.ini的位置