gestión de sesiones en webman
Ejemplo
<?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('hello ' . $session->get('name'));
}
}
A través de $request->session();
se obtiene una instancia de Workerman\Protocols\Http\Session
, y se utilizan los métodos de la instancia para agregar, modificar o eliminar datos de la sesión.
Nota: Cuando el objeto de sesión se destruye, los datos de la sesión se guardan automáticamente, por lo que no se debe guardar el objeto devuelto por
$request->session()
en un arreglo global o en un miembro de clase, lo que podría impedir que la sesión se guarde.
Obtener todos los datos de la sesión
$session = $request->session();
$all = $session->all();
Devuelve un arreglo. Si no hay datos de sesión, devuelve un arreglo vacío.
Obtener un valor de la sesión
$session = $request->session();
$name = $session->get('name');
Si los datos no existen, se devuelve null.
También puedes pasar un valor por defecto como segundo parámetro al método get. Si no se encuentra un valor correspondiente en el arreglo de sesión, se devolverá el valor por defecto. Por ejemplo:
$session = $request->session();
$name = $session->get('name', 'tom');
Almacenar sesión
Para almacenar un dato, usa el método set.
$session = $request->session();
$session->set('name', 'tom');
set no devuelve un valor, y la sesión se guarda automáticamente cuando el objeto de sesión se destruye.
Para almacenar múltiples valores, usa el método put.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
De igual manera, put tampoco devuelve un valor.
Eliminar datos de la sesión
Para eliminar un dato o varios de la sesión, usa el método forget
.
$session = $request->session();
// Eliminar un dato
$session->forget('name');
// Eliminar varios datos
$session->forget(['name', 'age']);
Además, el sistema ofrece el método delete, cuya diferencia con forget es que delete solo puede eliminar un dato.
$session = $request->session();
// Equivalente a $session->forget('name');
$session->delete('name');
Obtener y eliminar un valor de la sesión
$session = $request->session();
$name = $session->pull('name');
Funciona igual que el siguiente código:
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
Si la sesión correspondiente no existe, devolverá null.
Eliminar todos los datos de la sesión
$request->session()->flush();
No devuelve un valor, y la sesión se elimina automáticamente del almacenamiento cuando el objeto de sesión se destruye.
Comprobar si un dato de sesión existe
$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, devuelve true.
$session = $request->session();
$has = $session->exists('name');
El código anterior también se utiliza para comprobar si los datos de la sesión existen; la diferencia es que si el valor de la sesión correspondiente es null, también devolverá true.
Función auxiliar session()
webman proporciona la función auxiliar session()
para realizar la misma funcionalidad.
// Obtener instancia de sesión
$session = session();
// Equivalente a
$session = $request->session();
// Obtener un valor
$value = session('key', 'default');
// Equivalente a
$value = session()->get('key', 'default');
// Equivalente a
$value = $request->session()->get('key', 'default');
// Asignar valor a la sesión
session(['key1'=>'value1', 'key2' => 'value2']);
// Equivalente a
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Equivalente a
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);
Archivo de configuración
El archivo de configuración de la sesión se encuentra en config/session.php
, con un contenido similar al siguiente:
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
return [
// FileSessionHandler::class o RedisSessionHandler::class o RedisClusterSessionHandler::class
'handler' => FileSessionHandler::class,
// si el handler es FileSessionHandler::class, el valor es file,
// si el handler es RedisSessionHandler::class, el valor es redis
// si el handler es RedisClusterSessionHandler::class, el valor es redis_cluster (es decir, clúster redis)
'type' => 'file',
// Diferentes manejadores usan diferentes configuraciones
'config' => [
// configuración para el tipo file
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// configuración para el 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' => 'PHPSID', // Nombre de la cookie que almacena session_id
'auto_update_timestamp' => false, // Si se actualiza automáticamente la sesión, por defecto está desactivado
'lifetime' => 7*24*60*60, // Tiempo de expiración de la sesión
'cookie_lifetime' => 365*24*60*60, // Tiempo de expiración de la cookie que almacena session_id
'cookie_path' => '/', // Ruta de la cookie que almacena session_id
'domain' => '', // Dominio de la cookie que almacena session_id
'http_only' => true, // Si se activa httpOnly, por defecto está activado
'secure' => false, // Solo activar sesión bajo https, por defecto está desactivado
'same_site' => '', // Para prevenir ataques CSRF y seguimiento de usuarios, opciones: strict/lax/none
'gc_probability' => [1, 1000], // Probabilidad de recolección de sesiones
];
Seguridad
No se recomienda almacenar directamente instancias de clase al usar sesiones, especialmente si son instancias de clase de origen no controlado, ya que la deserialización puede causar riesgos potenciales.