Instrucciones
Workerman a partir de la versión 4.x ha mejorado el soporte para servicios HTTP. Se han introducido las clases de solicitud, respuesta, sesión y SSE. Si deseas utilizar el servicio HTTP de Workerman, se recomienda encarecidamente usar Workerman 4.x o versiones posteriores.
Obtener el objeto de sesión
$session = $request->session();
Ejemplo
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'));
};
// Ejecutar el worker
Worker::runAll();
Notas
- La sesión debe ser manipulada antes de la llamada a
$connection->send(). - La sesión se guardará automáticamente al destruir el objeto, por lo tanto, no debes guardar el objeto retornado por
$request->session()en un arreglo global o como miembro de una clase, ya que esto podría causar que la sesión no se guarde. - La sesión se almacena por defecto en archivos en disco; si buscas un mejor rendimiento, se recomienda utilizar Redis.
Obtener todos los datos de la sesión
$session = $request->session();
$all = $session->all();
Esto devolverá un arreglo. Si no hay datos de sesión, se devolverá un arreglo vacío.
Ejemplo
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));
};
// Ejecutar el worker
Worker::runAll();
Obtener un valor de la sesión
$session = $request->session();
$name = $session->get('name');
Si los datos no existen, devolverá null.
También puedes pasar un valor predeterminado como segundo parámetro al método get; si no se encuentra el valor correspondiente en el arreglo de sesión, se devolverá el valor predeterminado. Por ejemplo:
$session = $request->session();
$name = $session->get('name', 'tom');
Ejemplo
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'));
};
// Ejecutar el worker
Worker::runAll();
Almacenar sesión
Para almacenar un dato, utiliza el método set.
$session = $request->session();
$session->set('name', 'tom');
Set no devuelve ningún valor, la sesión se guardará automáticamente al destruir el objeto de sesión.
Cuando desees almacenar múltiples valores, utiliza el método put.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
De igual forma, put no devuelve ningún valor.
Ejemplo
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'));
};
// Ejecutar el worker
Worker::runAll();
Eliminar datos de la sesión
Para eliminar un dato o varios datos de la sesión, utiliza el método forget.
$session = $request->session();
// Eliminar un item
$session->forget('name');
// Eliminar varios items
$session->forget(['name', 'age']);
Además, el sistema ofrece el método delete, la diferencia con forget es que delete solo puede eliminar un item.
$session = $request->session();
// Equivalente a $session->forget('name');
$session->delete('name');
Ejemplo
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');
};
// Ejecutar el worker
Worker::runAll();
Obtener y eliminar un valor de la sesión
$session = $request->session();
$name = $session->pull('name');
Esto tiene el mismo efecto que el siguiente código
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
Si la sesión correspondiente no existe, devolverá null.
Ejemplo
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'));
};
// Ejecutar el worker
Worker::runAll();
Eliminar todos los datos de la sesión
$request->session()->flush();
No devuelve ningún valor, la sesión se eliminará automáticamente del almacenamiento al destruir el objeto de sesión.
Ejemplo
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');
};
// Ejecutar el worker
Worker::runAll();
Comprobar si existe un dato en la sesión
$session = $request->session();
$has = $session->has('name');
Lo anterior devolverá false si la sesión correspondiente no existe o si el valor de la sesión es null; de lo contrario, devolverá true.
$session = $request->session();
$has = $session->exists('name');
El código anterior también se utiliza para verificar si los datos de la sesión existen; la diferencia es que si el valor del item de la sesión es null, también devolverá true.
Notas
No se recomienda almacenar directamente instancias de clases durante el uso de la sesión, especialmente aquellas instancias de clase cuya fuente no es controlable, ya que la deserialización puede presentar riesgos potenciales.