Descrição
O Workerman a partir da versão 4.x melhorou o suporte para serviços HTTP. Introduziu classes de requisição, resposta, sessão, e SSE. Se você deseja utilizar o serviço HTTP do Workerman, é altamente recomendável usar a versão 4.x ou versões superiores.
Obtendo o objeto session
$session = $request->session();
Exemplo
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$session->set('name', 'tome');
$connection->send($session->get('name'));
};
// Executar o worker
Worker::runAll();
Observações
- A sessão deve ser manipulada antes da chamada de
$connection->send(). - A sessão será automaticamente salva ao destruir o objeto, portanto, não armazene o objeto retornado por
$request->session()em um array global ou em membros de classe, o que pode impedir a sessão de ser salva. - A sessão é armazenada por padrão em arquivos no disco. Para melhor desempenho, recomenda-se usar o Redis.
Obtendo todos os dados da sessão
$session = $request->session();
$all = $session->all();
Retorna um array. Se não houver dados de sessão, retorna um array vazio.
Exemplo
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$session->set('name', 'tom');
$connection->send(var_export($session->all(), true));
};
// Execução do worker
Worker::runAll();
Obtendo um valor específico da sessão
$session = $request->session();
$name = $session->get('name');
Se os dados não existirem, retorna null.
Você também pode passar um valor padrão como segundo parâmetro para o método get; se o valor correspondente não for encontrado no array de sessão, ele retornará o valor padrão. Por exemplo:
$session = $request->session();
$name = $session->get('name', 'tom');
Exemplo
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$connection->send($session->get('name', 'tom'));
};
// Execução do worker
Worker::runAll();
Armazenando sessão
Para armazenar um item de dado, utilize o método set.
$session = $request->session();
$session->set('name', 'tom');
O set não retorna valor, a sessão será automaticamente salva ao destruir o objeto de sessão.
Ao armazenar múltiplos valores, utilize o método put.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
Da mesma forma, o put também não retorna um valor.
Exemplo
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$session->set('name', 'tom');
$connection->send($session->get('name'));
};
// Execução do worker
Worker::runAll();
Removendo dados da sessão
Para remover um ou mais dados da sessão, utilize o método forget.
$session = $request->session();
// Remover um item
$session->forget('name');
// Remover múltiplos itens
$session->forget(['name', 'age']);
Além disso, o sistema oferece o método delete, que difere do método forget, pois o delete pode remover apenas um item.
$session = $request->session();
// Equivale a $session->forget('name');
$session->delete('name');
Exemplo
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$request->session()->forget('name');
$connection->send('ok');
};
// Execução do worker
Worker::runAll();
Obtendo e removendo um valor da sessão
$session = $request->session();
$name = $session->pull('name');
O efeito é o mesmo que o código abaixo
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
Se a sessão correspondente não existir, retorna null.
Exemplo
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$connection->send($request->session()->pull('name'));
};
// Execução do worker
Worker::runAll();
Removendo todos os dados da sessão
$request->session()->flush();
Não retorna valor, a sessão será automaticamente removida do armazenamento ao destruir o objeto de sessão.
Exemplo
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$request->session()->flush();
$connection->send('ok');
};
// Execução do worker
Worker::runAll();
Verificando se dados da sessão existem
$session = $request->session();
$has = $session->has('name');
O código acima retorna false se a sessão correspondente não existir ou se o valor da sessão for null; caso contrário, retorna true.
$session = $request->session();
$has = $session->exists('name');
O código acima também serve para verificar se os dados da sessão existem, a diferença é que quando o valor da sessão correspondente for null, ele também retornará true.
Observações
Ao utilizar sessões, não é recomendado armazenar diretamente instâncias de classes, especialmente instâncias de classes de fontes não controláveis, pois a desserialização pode causar riscos potenciais.