Gestão de sessão webman
Exemplo
<?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'));
}
}
Obtenha uma instância de Workerman\Protocols\Http\Session através de $request->session(); e use os métodos da instância para adicionar, modificar ou excluir dados da sessão.
Nota
Os dados da sessão são salvos automaticamente quando o objeto da sessão é destruído.
Armazenar o objeto da sessão em uma variável global impede sua destruição e o salvamento automático. Nesse caso, chame manualmente$session->save()para salvar os dados.
Obter todos os dados da sessão
$session = $request->session();
$all = $session->all();
Retorna um array. Se não houver dados na sessão, retorna um array vazio.
Obter um valor da sessão
$session = $request->session();
$name = $session->get('name');
Retorna null se os dados não existirem.
Você pode passar um valor padrão como segundo argumento ao método get. Se o valor correspondente não for encontrado na sessão, o valor padrão será retornado. Por exemplo:
$session = $request->session();
$name = $session->get('name', 'tom');
Armazenar dados na sessão
Use o método set para armazenar um dado.
$session = $request->session();
$session->set('name', 'tom');
O método set não retorna valor. Os dados são salvos automaticamente quando o objeto da sessão é destruído.
Use o método put para armazenar vários valores.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
Da mesma forma, o método put não retorna valor.
Excluir dados da sessão
Use o método forget para excluir um ou mais dados da sessão.
$session = $request->session();
// Excluir um item
$session->forget('name');
// Excluir vários itens
$session->forget(['name', 'age']);
O sistema também fornece o método delete. Ao contrário de forget, ele só pode excluir um item.
$session = $request->session();
// Equivalente a $session->forget('name');
$session->delete('name');
Obter e excluir um valor da sessão
$session = $request->session();
$name = $session->pull('name');
Equivale ao seguinte código:
$session = $request->session();
$value = $session->get('name');
$session->delete('name');
Retorna null se o valor da sessão correspondente não existir.
Excluir todos os dados da sessão
$request->session()->flush();
Não retorna valor. Os dados são removidos automaticamente do armazenamento quando o objeto da sessão é destruído.
Verificar se um valor da sessão existe
$session = $request->session();
$has = $session->has('name');
Retorna false se o valor não existir ou for null; caso contrário, retorna true.
$session = $request->session();
$has = $session->exists('name');
O código acima também verifica a existência de um valor na sessão. A diferença é que exists retorna true mesmo quando o valor é null.
Função auxiliar session()
webman fornece a função auxiliar session() para as mesmas operações.
// Obter a instância da sessão
$session = session();
// Equivalente a
$session = $request->session();
// Obter um valor
$value = session('key', 'default');
// Equivalente a
$value = session()->get('key', 'default');
// Equivalente a
$value = $request->session()->get('key', 'default');
// Definir valores na sessão
session(['key1'=>'value1', 'key2' => 'value2']);
// Equivalente a
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Equivalente a
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);
Arquivo de configuração
O arquivo de configuração da sessão está em config/session.php. O conteúdo é semelhante a:
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
return [
// FileSessionHandler::class ou RedisSessionHandler::class ou RedisClusterSessionHandler::class
'handler' => FileSessionHandler::class,
// Quando handler é FileSessionHandler::class, o valor é 'file',
// quando handler é RedisSessionHandler::class, o valor é 'redis'
// quando handler é RedisClusterSessionHandler::class, o valor é 'redis_cluster' (cluster Redis)
'type' => 'file',
// Diferentes handlers usam configurações diferentes
'config' => [
// Configuração quando type é 'file'
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// Configuração quando type é 'redis'
'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', // Nome do cookie para armazenar o session_id
'auto_update_timestamp' => false, // Atualizar automaticamente a sessão, padrão: desligado
'lifetime' => 7*24*60*60, // Tempo de expiração da sessão
'cookie_lifetime' => 365*24*60*60, // Tempo de expiração do cookie que armazena o session_id
'cookie_path' => '/', // Caminho do cookie que armazena o session_id
'domain' => '', // Domínio do cookie que armazena o session_id
'http_only' => true, // Habilitar httpOnly, padrão: habilitado
'secure' => false, // Habilitar sessão apenas em HTTPS, padrão: desligado
'same_site' => '', // Prevenir ataques CSRF e rastreamento de usuários, opções: strict/lax/none
'gc_probability' => [1, 1000], // Probabilidade de coleta de sessão
];
Segurança
Não é recomendável armazenar diretamente instâncias de classes na sessão, especialmente de classes de fontes não confiáveis. A desserialização pode introduzir riscos de segurança.