webman session管理
例子
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$name = $request->get('name');
$session = $request->session();
$session->set('name', $name);
return response('hello ' . $session->get('name'));
}
}
通過(guò)$request->session();
獲得Workerman\Protocols\Http\Session
實(shí)例,通過(guò)實(shí)例的方法來(lái)增加、修改、刪除session數(shù)據(jù)。
注意:session對(duì)象銷(xiāo)毀時(shí)會(huì)自動(dòng)保存session數(shù)據(jù),所以不要把
$request->session()
返回的對(duì)象保存在全局?jǐn)?shù)組或者類(lèi)成員中導(dǎo)致session無(wú)法保存。
獲取所有session數(shù)據(jù)
$session = $request->session();
$all = $session->all();
返回的是一個(gè)數(shù)組。如果沒(méi)有任何session數(shù)據(jù),則返回一個(gè)空數(shù)組。
獲取session中某個(gè)值
$session = $request->session();
$name = $session->get('name');
如果數(shù)據(jù)不存在則返回null。
你也可以給get方法第二個(gè)參數(shù)傳遞一個(gè)默認(rèn)值,如果session數(shù)組中沒(méi)找到對(duì)應(yīng)值則返回默認(rèn)值。例如:
$session = $request->session();
$name = $session->get('name', 'tom');
存儲(chǔ)session
存儲(chǔ)某一項(xiàng)數(shù)據(jù)時(shí)用set方法。
$session = $request->session();
$session->set('name', 'tom');
set沒(méi)有返回值,session對(duì)象銷(xiāo)毀時(shí)session會(huì)自動(dòng)保存。
當(dāng)存儲(chǔ)多個(gè)值時(shí)使用put方法。
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
同樣的,put也沒(méi)有返回值。
刪除session數(shù)據(jù)
刪除某個(gè)或者某些session數(shù)據(jù)時(shí)用forget
方法。
$session = $request->session();
// 刪除一項(xiàng)
$session->forget('name');
// 刪除多項(xiàng)
$session->forget(['name', 'age']);
另外系統(tǒng)提供了delete方法,與forget方法區(qū)別是,delete只能刪除一項(xiàng)。
$session = $request->session();
// 等同于 $session->forget('name');
$session->delete('name');
獲取并刪除session某個(gè)值
$session = $request->session();
$name = $session->pull('name');
效果與如下代碼相同
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
如果對(duì)應(yīng)session不存在,則返回null。
刪除所有session數(shù)據(jù)
$request->session()->flush();
沒(méi)有返回值,session對(duì)象銷(xiāo)毀時(shí)session會(huì)自動(dòng)從存儲(chǔ)中刪除。
判斷對(duì)應(yīng)session數(shù)據(jù)是否存在
$session = $request->session();
$has = $session->has('name');
以上當(dāng)對(duì)應(yīng)的session不存在或者對(duì)應(yīng)的session值為null時(shí)返回false,否則返回true。
$session = $request->session();
$has = $session->exists('name');
以上代碼也是用來(lái)判斷session數(shù)據(jù)是否存在,區(qū)別是當(dāng)對(duì)應(yīng)的session項(xiàng)值為null時(shí),也返回true。
助手函數(shù)session()
2020-12-09 新增
webman提供了助手函數(shù)session()
完成相同的功能。
// 獲取session實(shí)例
$session = session();
// 等價(jià)于
$session = $request->session();
// 獲取某個(gè)值
$value = session('key', 'default');
// 等價(jià)與
$value = session()->get('key', 'default');
// 等價(jià)于
$value = $request->session()->get('key', 'default');
// 給session賦值
session(['key1'=>'value1', 'key2' => 'value2']);
// 相當(dāng)于
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// 相當(dāng)于
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);
配置文件
session配置文件在config/session.php
,內(nèi)容類(lèi)似如下:
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
return [
// FileSessionHandler::class 或者 RedisSessionHandler::class 或者 RedisClusterSessionHandler::class
'handler' => FileSessionHandler::class,
// handler為FileSessionHandler::class時(shí)值為file,
// handler為RedisSessionHandler::class時(shí)值為redis
// handler為RedisClusterSessionHandler::class時(shí)值為redis_cluster 既redis集群
'type' => 'file',
// 不同的handler使用不同的配置
'config' => [
// type為file時(shí)的配置
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// type為redis時(shí)的配置
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'auth' => '',
'timeout' => 2,
'database' => '',
'prefix' => 'redis_session_',
],
'redis_cluster' => [
'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
'timeout' => 2,
'auth' => '',
'prefix' => 'redis_session_',
]
],
'session_name' => 'PHPSID', // 存儲(chǔ)session_id的cookie名
'auto_update_timestamp' => false, // 是否自動(dòng)刷新session,默認(rèn)關(guān)閉
'lifetime' => 7*24*60*60, // session過(guò)期時(shí)間
'cookie_lifetime' => 365*24*60*60, // 存儲(chǔ)session_id的cookie過(guò)期時(shí)間
'cookie_path' => '/', // 存儲(chǔ)session_id的cookie路徑
'domain' => '', // 存儲(chǔ)session_id的cookie域名
'http_only' => true, // 是否開(kāi)啟httpOnly,默認(rèn)開(kāi)啟
'secure' => false, // 僅在https下開(kāi)啟session,默認(rèn)關(guān)閉
'same_site' => '', // 用于防止CSRF攻擊和用戶(hù)追蹤,可選值strict/lax/none
'gc_probability' => [1, 1000], // 回收session的幾率
];
注意
webman從1.4.0起更改了SessionHandler的命名空間,由原來(lái)的
use Webman\FileSessionHandler;
use Webman\RedisSessionHandler;
use Webman\RedisClusterSessionHandler;
改為
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
有效期配置
當(dāng)webman-framework < 1.3.14時(shí),webman中session過(guò)期時(shí)間需要在php.ini
配置。
session.gc_maxlifetime = x
session.cookie_lifetime = x
session.gc_probability = 1
session.gc_divisor = 1000
假設(shè)設(shè)定有效期為1440秒,則配置如下
session.gc_maxlifetime = 1440
session.cookie_lifetime = 1440
session.gc_probability = 1
session.gc_divisor = 1000
提示
可使用命令php --ini
來(lái)查找php.ini
的位置