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.