Descripción
Desde la versión 4.x, Workerman ha mejorado el soporte para servicios HTTP. Se han introducido clases de solicitud, clase de respuesta, clase de sesión y SSE. Si deseas utilizar el servicio HTTP de Workerman, se recomienda encarecidamente usar Workerman 4.x o versiones posteriores.
Ten en cuenta que todos los ejemplos a continuación son para la versión 4.x de Workerman y no son compatibles con Workerman 3.x.
Cambiar el motor de almacenamiento de la sesión
Workerman proporciona un motor de almacenamiento de sesión basado en archivos y un motor de almacenamiento de sesión en Redis. Por defecto, se utiliza el motor de almacenamiento de archivos. Si deseas cambiar a un motor de almacenamiento en Redis, consulta el siguiente código.
<?php
use Workerman\Worker;
use Workerman\Protocols\Http\Session;
use Workerman\Protocols\Http\Session\RedisSessionHandler;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
// configuración de redis
$config = [
'host' => '127.0.0.1', // Parámetro requerido
'port' => 6379, // Parámetro requerido
'timeout' => 2, // Parámetro opcional
'auth' => '******', // Parámetro opcional
'database' => 1, // Parámetro opcional
'prefix' => 'session_' // Parámetro opcional
];
// Usa el método Workerman\Protocols\Http\Session::handlerClass para cambiar la clase del controlador de sesión subyacente
Session::handlerClass(RedisSessionHandler::class, $config);
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$session->set('somekey', rand());
$connection->send($session->get('somekey'));
};
Worker::runAll();
Establecer la ubicación de almacenamiento de la sesión
Al usar el motor de almacenamiento predeterminado, los datos de la sesión se almacenan en el disco de manera predeterminada, en la ubicación que devuelve session_save_path(). Puedes cambiar la ubicación de almacenamiento utilizando el siguiente método.
use Workerman\Worker;
use \Workerman\Protocols\Http\Session\FileSessionHandler;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
// Establecer la ubicación del almacenamiento de archivos de sesión
FileSessionHandler::sessionSavePath('/tmp/session');
$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();
Limpieza de archivos de sesión
Al usar el motor de almacenamiento de sesión predeterminado, habrá múltiples archivos de sesión en el disco. Workerman limpiará los archivos de sesión caducados según las opciones session.gc_probability, session.gc_divisor y session.gc_maxlifetime configuradas en php.ini. Para más información sobre estas tres opciones, consulta la documentación de PHP
Cambiar el controlador de almacenamiento
Además del motor de almacenamiento de sesión basado en archivos y el motor de almacenamiento de sesión en Redis, Workerman te permite agregar nuevos motores de almacenamiento de sesión a través de la interfaz estándar SessionHandlerInterface, como el motor de almacenamiento de sesión en MangoDB, MySQL, entre otros.
Proceso para agregar un nuevo motor de almacenamiento de sesión
- Implementar la interfaz SessionHandlerInterface
- Usar el método
Workerman\Protocols\Http\Session::handlerClass($class_name, $config)para reemplazar la interfaz SessionHandler subyacente
Implementación de la interfaz SessionHandlerInterface
Los controladores de almacenamiento de sesión personalizados deben implementar la interfaz SessionHandlerInterface. Esta interfaz contiene los siguientes métodos:
SessionHandlerInterface {
/* Métodos */
abstract public read ( string $session_id ) : string
abstract public write ( string $session_id , string $session_data ) : bool
abstract public destroy ( string $session_id ) : bool
abstract public gc ( int $maxlifetime ) : int
abstract public close ( void ) : bool
abstract public open ( string $save_path , string $session_name ) : bool
}
Descripción de la SessionHandlerInterface
- El método read se utiliza para leer todos los datos de sesión correspondientes a session_id desde el almacenamiento. No debes realizar operaciones de deserialización sobre los datos, ya que el marco lo completará automáticamente.
- El método write se utiliza para escribir los datos de sesión correspondientes a session_id en el almacenamiento. No debes realizar operaciones de serialización sobre los datos, ya que el marco ya lo ha completado automáticamente.
- El método destroy se utiliza para destruir los datos de sesión correspondientes a session_id.
- El método gc se utiliza para eliminar los datos de sesión caducados; el almacenamiento debe eliminar todas las sesiones cuya última fecha de modificación sea mayor que maxlifetime.
- No es necesario realizar ninguna operación en close; simplemente devuelve true.
- No es necesario realizar ninguna operación en open; simplemente devuelve true.
Reemplazo del controlador subyacente
Después de implementar la interfaz SessionHandlerInterface, utiliza el siguiente método para cambiar el controlador de la sesión subyacente.
Workerman\Protocols\Http\Session::handlerClass($class_name, $config);
- $class_name es el nombre de la clase SessionHandler que implementa la interfaz SessionHandlerInterface. Si hay un espacio de nombres, debe incluirse el nombre de espacio completo.
- $config son los parámetros del constructor de la clase SessionHandler.
Implementación específica
Nota: Esta clase MySessionHandler solo se utiliza para ilustrar el proceso de cambio de controlador de sesión. MySessionHandler no se puede utilizar en un entorno de producción.
<?php
use Workerman\Worker;
use Workerman\Protocols\Http\Session;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8080');
class MySessionHandler implements SessionHandlerInterface
{
protected static $store = [];
public function __construct($config) {
// ['host' => 'localhost']
var_dump($config);
}
public function open($save_path, $name)
{
return true;
}
public function read($session_id)
{
return isset(static::$store[$session_id]) ? static::$store[$session_id]['content'] : '';
}
public function write($session_id, $session_data)
{
static::$store[$session_id] = ['content' => $session_data, 'timestamp' => time()];
}
public function close()
{
return true;
}
public function destroy($session_id)
{
unset(static::$store[$session_id]);
return true;
}
public function gc($maxlifetime) {
$time_now = time();
foreach (static::$store as $session_id => $info) {
if ($time_now - $info['timestamp'] > $maxlifetime) {
unset(static::$store[$session_id]);
}
}
}
}
// Supongamos que la nueva clase SessionHandler implementada necesita algunos parámetros de configuración
$config = ['host' => 'localhost'];
// Usa Workerman\Protocols\Http\Session::handlerClass($class_name, $config) para cambiar la clase del controlador de sesión subyacente
Session::handlerClass(MySessionHandler::class, $config);
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$session = $request->session();
$session->set('somekey', rand());
$connection->send($session->get('somekey'));
};
Worker::runAll();