Explicação
A partir da versão 4.x, o Workerman reforçou o suporte aos serviços HTTP. Introduziu classes de requisição, classes de resposta, classes de sessão e SSE. Se você deseja utilizar os serviços HTTP do Workerman, é altamente recomendável usar a versão 4.x ou superior.
Observe que todos os exemplos pertencem à versão 4.x do Workerman e não são compatíveis com a versão 3.x.
Obter objeto de sessão
$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 worker
Worker::runAll();
Observações
- A sessão deve ser manipulada antes de chamar
$connection->send()
. - A sessão é automaticamente salva quando o objeto é destruído, portanto, não salve o objeto retornado por
$request->session()
em um array global ou membro da classe para evitar que a sessão não seja salva. - Por padrão, a sessão é armazenada em arquivos no disco. Para obter melhor desempenho, é recomendável utilizar o Redis.
Obter todos os dados da sessão
$session = $request->session();
$all = $session->all();
Retorna um array. Se não houver dados de sessão, um array vazio é retornado.
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));
};
// Executar worker
Worker::runAll();
Obter um valor específico da sessão
$session = $request->session();
$name = $session->get('name');
Se os dados não existirem, retorna null.
Também é possível passar um valor padrão como segundo argumento para o método get
. Se o valor correspondente não for encontrado no array da sessão, o valor padrão é retornado. 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'));
};
// Executar worker
Worker::runAll();
Armazenar sessão
Para armazenar um valor, use o método set
.
$session = $request->session();
$session->set('name', 'tom');
O método set
não retorna nada e a sessão é automaticamente salva quando o objeto da sessão é destruído.
Para armazenar múltiplos valores, use o método put
.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
Da mesma forma, o método put
não retorna nada.
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'));
};
// Executar worker
Worker::runAll();
Excluir dados da sessão
Para excluir um ou vários dados da sessão, use o método forget
.
$session = $request->session();
// Delete one
$session->forget('name');
// Delete multiple
$session->forget(['name', 'age']);
Além disso, o sistema fornece o método delete
, que difere do forget
ao excluir apenas um item.
$session = $request->session();
// Equivalente 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');
};
// Executar worker
Worker::runAll();
Obter e excluir um valor da sessão
$session = $request->session();
$name = $session->pull('name');
O efeito é o mesmo que o seguinte código:
$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'));
};
// Executar worker
Worker::runAll();
Excluir todos os dados da sessão
$request->session()->flush();
Não retorna nada e a sessão é automaticamente removida do armazenamento quando o objeto de sessão é destruído.
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');
};
// Executar worker
Worker::runAll();
Verificar se os dados da sessão correspondente existem
$session = $request->session();
$has = $session->has('name');
Quando a sessão correspondente não existe ou o valor correspondente é nulo, retorna falso; caso contrário, retorna verdadeiro.
$session = $request->session();
$has = $session->exists('name');
Este código também é utilizado para verificar se os dados da sessão existem. A diferença é que, quando o valor do item da sessão correspondente é nulo, ainda retorna verdadeiro.