Uso del administrador de sesiones de DynamoDB con la versión 3 de AWS SDK for PHP - AWS SDK for PHP

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Uso del administrador de sesiones de DynamoDB con la versión 3 de AWS SDK for PHP

El administrador de sesiones de DynamoDB es un administrador de sesiones personalizado para PHP que permite a los desarrolladores utilizar Amazon DynamoDB como almacén de sesiones. Si utiliza DynamoDB para el almacenamiento de sesiones evitará que surjan problemas al gestionar sesiones en una aplicación web distribuida, ya que las sesiones se trasladan del sistema de archivos local a una ubicación compartida DynamoDB es rápido, escalable, fácil de configurar y administra la replicación de los datos de forma automática.

El administrador de sesiones de DynamoDB utiliza la función session_set_save_handler() para enlazar las operaciones de DynamoDB con las funciones de sesión nativas de PHP para permitir un verdadero reemplazo. Esto incluye admitir características como el bloqueo de sesiones y la recopilación de elementos no utilizados, que forman parte del administrador de sesiones predeterminado de PHP.

Para obtener más información sobre el servicio DynamoDB, consulte la página de inicio de Amazon DynamoDB.

Uso básico

Paso 1: Registrar el administrador

En primer lugar, cree instancias y registre el administrador de sesiones.

use Aws\DynamoDb\SessionHandler; $dynamoDb = new Aws\DynamoDb\DynamoDbClient([ 'region'=>'us-east-1' // Since version 3.277.10 of the SDK, ]); // the 'version' parameter defaults to 'latest'. $sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions' ]); $sessionHandler->register();

Paso 2. Crear una tabla para almacenar sus sesiones

Antes de poder empezar a usar el administrador de sesiones, debe crear una tabla en la que se almacenen las sesiones. Puede hacerlo previamente utilizando la consola de AWS para Amazon DynamoDB, o el AWS SDK for PHP.

Al crear esta tabla utilice "id" como nombre de la clave principal. También se recomienda configurar un atributo Tiempo de vida utilizando el atributo "expires" para beneficiarse de la recopilación automática de elementos no utilizados de las sesiones.

Paso 3. Utilizar las sesiones de PHP como suele hacerlo

Una vez registrado el administrador de sesiones y cuando la tabla ya exista, podrá escribir y leer desde la sesión utilizando la $_SESSION superglobal, tal como suele hacer con el administrador de sesiones predeterminado de PHP. El administrador de DynamoDB encapsula y abstrae las interacciones con DynamoDB y le permite utilizar las funciones de sesión nativas y la interfaz de PHP.

// Start the session session_start(); // Alter the session data $_SESSION['user.name'] = 'jeremy'; $_SESSION['user.role'] = 'admin'; // Close the session (optional, but recommended) session_write_close();

Configuración

Puede configurar el comportamiento del administrador de sesiones utilizando las siguientes opciones. Todas las opciones son opcionales, pero asegúrese de que comprende cuáles son los valores predeterminados.

table_name

Nombre de la tabla de DynamoDB en la que se almacenan las sesiones. El valor predeterminado es 'sessions'.

hash_key

Nombre de la clave hash en la tabla de sesiones de DynamoDB. El valor predeterminado es 'id'.

data_attribute

Nombre del atributo de la tabla de sesiones de DynamoDB en el que se almacenan los datos de sesión. El valor predeterminado es 'data'.

data_attribute_type

Tipo de atributo de la tabla de sesiones de DynamoDB en la que se almacenan los datos de sesión. El valor predeterminado es 'string', pero se puede establecer de forma opcional en 'binary'.

session_lifetime

Es la vida útil de una sesión inactiva antes de que se recopile como elemento no utilizado. Si no es el caso, el valor de la vida útil real que se utilizará es ini_get('session.gc_maxlifetime').

session_lifetime_attribute

Nombre del atributo de la tabla de sesiones de DynamoDB en el que se almacena la hora de caducidad de la sesión. El valor predeterminado es 'expires'.

consistent_read

Indica si el administrador de sesiones debería utilizar lecturas consistentes para la operación GetItem. El valor predeterminado es true.

locking

Indica si se utiliza el bloqueo de sesiones. El valor predeterminado es false.

batch_config

Es la configuración utilizada para la eliminación de lotes al recopilar elementos no utilizados. Estas opciones se transfieren directamente a objetos DynamoDB WriteRequestBatch. Active manualmente la recopilación de elementos no utilizados mediante SessionHandler::garbageCollect().

max_lock_wait_time

Es el tiempo máximo (en segundos) que debe esperar el administrador de sesiones para adquirir un bloqueo antes de desistir. El valor predeterminado es 10 y solo se utiliza con el bloqueo de sesiones.

min_lock_retry_microtime

Es el tiempo mínimo (en microsegundos) que debe esperar el administrador de sesiones entre intentos para adquirir un bloqueo. El valor predeterminado es 10000 y solo se utiliza con el bloqueo de sesiones.

max_lock_retry_microtime

Es el tiempo máximo (en microsegundos) que debe esperar el administrador de sesiones entre intentos para adquirir un bloqueo. El valor predeterminado es 50000 y solo se utiliza con el bloqueo de sesiones.

Para configurar el administrador de sesiones, especifique las opciones de configuración cuando cree instancias del administrador. El siguiente código es un ejemplo de todas las opciones de configuración.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'hash_key' => 'id', 'data_attribute' => 'data', 'data_attribute_type' => 'string', 'session_lifetime' => 3600, 'session_lifetime_attribute' => 'expires', 'consistent_read' => true, 'locking' => false, 'batch_config' => [], 'max_lock_wait_time' => 10, 'min_lock_retry_microtime' => 5000, 'max_lock_retry_microtime' => 50000, ]);

Precios

Aparte del almacenamiento de datos y las tarifas de transferencia de datos, los costos asociados al uso de DynamoDB se calculan en función de la capacidad de rendimiento aprovisionada de la tabla (consulte la información sobre precios de Amazon DynamoDB). El rendimiento se mide en unidades de capacidad de escritura y capacidad de lectura. La página de inicio de Amazon DynamoDB indica:

Una unidad de capacidad de lectura representa una lectura de consistencia alta por segundo (o bien dos lecturas consistentes finales por segundo) para elementos de un tamaño de hasta 4 KB. Una unidad de capacidad de escritura representa una escritura por segundo para elementos de un tamaño de hasta 1 KB.

En definitiva, el rendimiento y los costos necesarios para su tabla de sesiones se corresponden con el tráfico esperado y el tamaño de la sesión. La siguiente tabla explica la cantidad de operaciones de lectura y escritura que se realizan en la tabla de DynamoDB para cada una de las funciones de la sesión.

Leer mediante session_start()

  • 1 operación de lectura (solo 0,5 si consistent_read es false).

  • (Condicional) 1 operación de escritura para eliminar la sesión si ha caducado.

Leer mediante session_start() (utilizando el bloqueo de sesiones)

  • 1 operación de escritura como mínimo.

  • (Condicional) Las operaciones de escritura adicionales para cada intento de adquisición de un bloqueo en la sesión. En función del tiempo de espera del bloqueo configurado y de las opciones de reintento.

  • (Condicional) 1 operación de escritura para eliminar la sesión si ha caducado.

Escribir mediante session_write_close()

  • 1 operación de escritura.

Eliminar mediante session_destroy()

  • 1 operación de escritura.

Recopilación de elementos no utilizados

  • 0,5 operaciones de lectura por 4 KB de datos de la tabla para buscar sesiones caducadas.

  • 1 operación de escritura por elemento caducado para eliminarlo.

Bloqueo de sesiones

El administrador de sesiones de DynamoDB es compatible con el bloqueo de sesiones pesimista para imitar el comportamiento del administrador de sesiones predeterminado de PHP. De forma predeterminada, el administrador de sesiones de DynamoDB tiene esta característica desactivada, ya que puede convertirse en un cuello de botella de rendimiento e incrementar los costos, especialmente cuando una aplicación accede a la sesión utilizando solicitudes Ajax o iframes. Es importante plantearse si la aplicación requiere el bloqueo de sesiones antes de habilitarlo.

Para habilitar el bloqueo de sesiones, establezca la opción 'locking' en true cuando cree instancias de SessionHandler.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'locking' => true, ]);

Recopilación de elementos no utilizados

Configure un atributo TTL en la tabla de DynamoDB, utilizando el atributo "expires". De este modo, se realizará automáticamente la recopilación de elementos no utilizados de las sesiones y se evitará la necesidad de realizarla usted mismo.

El administrador de sesiones de DynamoDB también admite la recopilación de elementos no utilizados de las sesiones mediante el uso de una serie de operaciones Scan y BatchWriteItem. Debido a la naturaleza del funcionamiento de la operación Scan, y para encontrar todas las sesiones caducadas y eliminarlas, el proceso de recopilación de elementos no utilizados puede requerir una gran cantidad de rendimiento provisionado.

Por este motivo, no se admite la recopilación automatizada. Una de las prácticas recomendadas es programar la recopilación fuera de las horas punta, cuando la ráfaga de rendimiento consumido no afecte al resto de la aplicación. Por ejemplo, puede configurar un trabajo cron por la noche que dispare un script para ejecutar la recopilación. Este script debería hacer algo similar a lo siguiente.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'batch_size' => 25, 'before' => function ($command) { echo "About to delete a batch of expired sessions.\n"; } ] ]); $sessionHandler->garbageCollect();

También puede utilizar la opción 'before' dentro de 'batch_config' para introducir retrasos en las operaciones BatchWriteItem que lleva a cabo el proceso de recopilación de elementos no utilizados. Esto aumentará el tiempo que se tarda en completar la recopilación de elementos no utilizados, pero puede ayudarle a distribuir las solicitudes realizadas por el administrador de sesiones de DynamoDB para mantenerse cerca o dentro de la capacidad de rendimiento provisionada durante la recopilación de elementos no utilizados.

$sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions', 'batch_config' => [ 'before' => function ($command) { $command['@http']['delay'] = 5000; } ] ]); $sessionHandler->garbageCollect();

Prácticas recomendadas

  1. Cree su tabla de sesiones en una región geográfica de AWS más cercana o en la misma región donde se encuentran los servidores de aplicaciones. De este modo, se consigue la latencia más baja entre su aplicación y la base de datos de DynamoDB.

  2. Elija la capacidad de rendimiento provisionada de su tabla de sesiones detenidamente. Tenga en cuenta el tráfico esperado en su aplicación y el tamaño previsto de sus sesiones. También puede utilizar el modo de capacidad de lectura/escritura "bajo demanda" para la tabla.

  3. Monitoree su rendimiento utilizado en la consola de administración de AWS o con Amazon CloudWatch y ajuste la configuración de su rendimiento según sea necesario para satisfacer las exigencias de su aplicación.

  4. Intente mantener un tamaño reducido de sus sesiones (idealmente de menos de 1 KB). Las sesiones pequeñas funcionan mejor y requieren menos capacidad de rendimiento provisionada.

  5. No utilice el bloqueo de sesiones a menos que lo requiera su aplicación.

  6. En lugar de utilizar disparadores de la recopilación de elementos no utilizados en las sesiones integrados en PHP, programe su recopilación mediante un trabajo cron u otro mecanismo de programación, para que se ejecute en las horas de menor actividad. Aproveche la opción 'batch_config'.

Permisos de IAM necesarios

Para utilizar el administrador de sesiones de DynamoDB, las credenciales configuradas deben tener permiso para utilizar la tabla de DynamoDB que creó en un paso anterior. La política de IAM siguiente contiene los permisos mínimos necesarios. Para utilizar esta política, sustituya el valor Recurso por el nombre de recurso de Amazon (ARN) de la tabla que creó anteriormente. Para obtener más información sobre cómo crear y adjuntar políticas de IAM, consulte Administración de políticas de IAM en la Guía del usuario de IAM.

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dynamodb:GetItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Scan", "dynamodb:BatchWriteItem" ], "Effect": "Allow", "Resource": "arn:aws:dynamodb:<region>:<account-id>:table/<table-name>" } ] }