Gestão de sessão
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('olá ' . $session->get('name'));
}
}
Obtenha uma instância de Workerman\Protocols\Http\Session
usando $request->session();
e use os métodos dessa instância para adicionar, alterar ou excluir dados da sessão.
Observação: Quando o objeto da sessão é destruído, os dados da sessão são salvos automaticamente. Portanto, não armazene o objeto retornado por
$request->session()
em um array global ou membro da classe, pois isso pode impedir o salvamento da sessão.
Obter todos os dados da sessão
$session = $request->session();
$all = $session->all();
Retorna um array. Se não houver nenhum dado na sessão, um array vazio será retornado.
Obter um valor da sessão
$session = $request->session();
$name = $session->get('name');
Se os dados não existirem, null será retornado.
Você também pode passar um valor padrão como segundo argumento para o método get
, que será retornado se o valor correspondente não for encontrado na sessão. Por exemplo:
$session = $request->session();
$name = $session->get('name', 'tom');
Armazenar na sessão
Use o método set
para armazenar um dado na sessão.
$session = $request->session();
$session->set('name', 'tom');
O método set
não retorna nada, e os dados da sessão são salvos automaticamente quando o objeto da sessão é destruído.
Ao armazenar vários valores, use o método put
.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
Novamente, o método put
não retorna nada.
Excluir dados da sessão
Use o método forget
para excluir um ou vários dados da sessão.
$session = $request->session();
// Excluir um item
$session->forget('name');
// Excluir vários itens
$session->forget(['name', 'age']);
Além disso, o sistema fornece o método delete
, que difere do método forget
apenas em relação à capacidade de excluir apenas 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');
O efeito acima é o mesmo que:
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
Se a sessão correspondente não existir, null será retornado.
Excluir todos os dados da sessão
$request->session()->flush();
Não há retorno, e os dados da sessão são removidos automaticamente do armazenamento quando o objeto da sessão é destruído.
Verificar se um dado da sessão existe
$session = $request->session();
$has = $session->has('name');
Quando a sessão correspondente não existe ou o valor da sessão correspondente é null, false é retornado; caso contrário, true é retornado.
$session = $request->session();
$has = $session->exists('name');
O código acima também é usado para verificar se um dado da sessão existe, mas difere no sentido de que, quando o valor associado à sessão é null, ele também retorna true.
Função auxiliar session()
Adicionado em 09/12/2020
O webman oferece a função auxiliar session()
para realizar as mesmas funcionalidades.
// Obter a instância da sessão
$session = session();
// Equivalente a
$session = $request->session();
// Obter um valor
$value = session('chave', 'padrão');
// Equivalente a
$value = session()->get('chave', 'padrão');
// Equivalente a
$value = $request->session()->get('chave', 'padrão');
// Definir valores na sessão
session(['chave1'=>'valor1', 'chave2' => 'valor2']);
// Equivalente a
session()->put(['chave1'=>'valor1', 'chave2' => 'valor2']);
// Equivalente a
$request->session()->put(['chave1'=>'value1', 'chave2' => 'valor2']);
Arquivo de configuração
O arquivo de configuração da sessão está em config/session.php
e é semelhante ao exemplo a seguir:
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 o manipulador é FileSessionHandler::class, o valor é file
// Quando o manipulador é RedisSessionHandler::class, o valor é redis
// Quando o manipulador é RedisClusterSessionHandler::class, o valor é redis_cluster (ou seja, cluster Redis)
'type' => 'file',
// Diferentes manipuladores de sessão usam diferentes configurações
'config' => [
// Configuração quando o tipo é file
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// Configuração quando o tipo é 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' => 'PHPSESSID', // Nome do cookie para armazenar o session_id
// === As configurações a seguir exigem webman-framework>=1.3.14 workerman>=4.0.37 ===
'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 para armazenar o session_id
'cookie_path' => '/', // Caminho do cookie para armazenar o session_id
'domain' => '', // Domínio do cookie que armazena o session_id
'http_only' => true, // Ativar o httpOnly, padrão é ativar
'secure' => false, // Ativar a sessão apenas em https, padrão é desativar
'same_site' => '', // Usado para evitar ataques CSRF e rastreamento de usuários, valores possíveis: strict/lax/none
'gc_probability' => [1, 1000], // Probabilidade de recolha da sessão
];
Observação
A partir de webman 1.4.0, o namespace do SessionHandler foi alterado de:
use Webman\FileSessionHandler;
use Webman\RedisSessionHandler;
use Webman\RedisClusterSessionHandler;
Para:
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
Configuração de tempo de vida
Quando o webman-framework < 1.3.14, o tempo de expiração da sessão no webman precisa ser configurado no php.ini
.
session.gc_maxlifetime = x
session.cookie_lifetime = x
session.gc_probability = 1
session.gc_divisor = 1000
Por exemplo, se o tempo de expiração for definido como 1440 segundos, a configuração ficará assim:
session.gc_maxlifetime = 1440
session.cookie_lifetime = 1440
session.gc_probability = 1
session.gc_divisor = 1000
Nota
Você pode usar o comandophp --ini
para localizar o arquivophp.ini
.