Utilisation du gestionnaire de session DynamoDB avec la version 3 AWS SDK for PHP - AWS SDK for PHP

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation du gestionnaire de session DynamoDB avec la version 3 AWS SDK for PHP

Le gestionnaire de session DynamoDB est un gestionnaire de session personnalisé pour PHP qui permet aux développeurs d'utiliser Amazon DynamoDB comme magasin de sessions. L'utilisation de DynamoDB pour le stockage de sessions atténue les problèmes liés à la gestion des sessions dans une application Web distribuée en déplaçant les sessions du système de fichiers local vers un emplacement partagé. DynamoDB est rapide, évolutif, facile à configurer et gère automatiquement la réplication de vos données.

Le gestionnaire de session DynamoDB utilise cette session_set_save_handler() fonction pour connecter les opérations DynamoDB aux fonctions de session natives de PHP afin de permettre une véritable perte de remplacement. Cela inclut la prise en charge de fonctions telles que le verrouillage de session et le nettoyage de la mémoire, qui font partie intégrante du gestionnaire de sessions par défaut de PHP.

Pour plus d'informations sur le service DynamoDB, consultez la page d'accueil d'Amazon DynamoDB.

Utilisation de base

Étape 1 : enregistrer le gestionnaire

Tout d'abord, instanciez et enregistrez le gestionnaire de sessions.

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();

Étape 2. Créez un tableau pour enregistrer vos sessions

Avant de pouvoir utiliser le gestionnaire de session, vous devez créer un tableau dans lequel stocker les sessions. Vous pouvez le faire à l'avance en utilisant la AWSconsole pour Amazon DynamoDB ou en utilisant le. AWS SDK for PHP

Lorsque vous créez ce tableau, utilisez « id » pour le nom de la clé primaire. Nous vous recommandons également de configurer un attribut de durée de vie en utilisant l'attribut « expires » pour bénéficier du nettoyage automatique de la mémoire des sessions.

Étape 3. Utilisez les sessions PHP comme vous le feriez normalement

Une fois que le gestionnaire de session est enregistré et que le tableau existe, vous pouvez écrire et lire depuis la session à l'aide de la variable superglobale $_SESSION, tout comme vous le feriez normalement avec le gestionnaire de sessions par défaut de PHP. Le gestionnaire de session DynamoDB encapsule et résume les interactions avec DynamoDB et vous permet d'utiliser simplement les fonctions et l'interface de session natives 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();

Configuration

Vous pouvez configurer le comportement du gestionnaire de session à l'aide des options suivantes. Toutes les options sont facultatives, mais veillez à comprendre les valeurs par défaut.

table_name

Nom de la table DynamoDB dans laquelle les sessions doivent être stockées. La valeur par défaut est 'sessions'.

hash_key

Nom de la clé de hachage dans le tableau des sessions DynamoDB. La valeur par défaut est 'id'.

data_attribute

Nom de l'attribut dans la table des sessions DynamoDB dans lequel les données de session sont stockées. La valeur par défaut est 'data'.

data_attribute_type

Type de l'attribut dans la table des sessions DynamoDB dans lequel les données de session sont stockées. La valeur par défaut est 'string', mais elle peut éventuellement être définie sur 'binary'.

session_lifetime

La durée de vie d'une session inactive avant de devoir être nettoyée de la mémoire. Si elle n'est pas fournie, la valeur réelle de la durée de vie utilisée sera ini_get('session.gc_maxlifetime').

session_lifetime_attribute

Nom de l'attribut dans le tableau des sessions DynamoDB dans lequel le délai d'expiration des sessions est enregistré. La valeur par défaut est 'expires'.

consistent_read

Indique si le gestionnaire de session doit utiliser des lectures cohérentes pour l'opération GetItem. La valeur par défaut est true.

locking

Indique s'il faut utiliser le verrouillage de session. La valeur par défaut est false.

batch_config

Configuration utilisée pour la suppression par lots pendant le nettoyage de la mémoire. Ces options sont transmises directement aux objets WriteRequestBatchDynamoDB. Déclenchez manuellement le nettoyage de la mémoire via SessionHandler::garbageCollect().

max_lock_wait_time

Durée maximale (en secondes) pendant laquelle le gestionnaire de session doit attendre l'acquisition d'un verrouillage avant d'abandonner. La valeur par défaut est 10 et est utilisée uniquement avec le verrouillage de session.

min_lock_retry_microtime

Durée minimale (en microsecondes) pendant laquelle le gestionnaire de session doit attendre entre deux tentatives d'acquisition d'un verrouillage. La valeur par défaut est 10000 et est utilisée uniquement avec le verrouillage de session.

max_lock_retry_microtime

Durée maximale (en microsecondes) pendant laquelle le gestionnaire de session doit attendre entre deux tentatives d'acquisition d'un verrouillage. La valeur par défaut est 50000 et est utilisée uniquement avec le verrouillage de session.

Pour configurer le Gestionnaire de sessions, spécifiez les options de configuration lorsque vous instanciez le gestionnaire. Le code suivant est un exemple avec toutes les options de configuration spécifiées.

$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, ]);

Tarification

Outre les frais de stockage et de transfert de données, les coûts associés à l'utilisation de DynamoDB sont calculés en fonction de la capacité de débit allouée à votre table (voir les détails de tarification d'Amazon DynamoDB). Le débit est mesuré en unités de capacité d'écriture et de capacité de lecture. La page d'accueil d'Amazon DynamoDB indique :

Une unité de capacité de lecture représente une lecture à cohérence forte par seconde (ou deux lectures cohérentes à terme par seconde) pour des éléments dont la taille peut atteindre jusqu'à 4 Ko. Une unité de capacité d'écriture représente une écriture par seconde pour des éléments dont la taille peut atteindre jusqu'à 1 Ko.

Enfin, le débit et les coûts nécessaires pour votre tableau de sessions seront corrélés au trafic attendu et à la taille de session. Le tableau suivant explique le nombre d'opérations de lecture et d'écriture effectuées sur votre table DynamoDB pour chacune des fonctions de session.

Lecture via session_start()

  • 1 opération de lecture (uniquement 0,5 si consistent_read est égal à false).

  • (Conditionnel) 1 opération d'écriture pour supprimer la session si elle a expiré.

Lecture via session_start() (Utilisation de verrouillage de session)

  • Un minimum de 1 opération d’écriture.

  • (Conditionnel) Opérations d'écriture supplémentaires pour chaque tentative d'acquérir un verrouillage sur la session. En fonction du temps d'attente entre les verrouillages et des options de nouvel essai.

  • (Conditionnel) 1 opération d'écriture pour supprimer la session si elle a expiré.

Écriture via session_write_close()

  • 1 opération d'écriture.

Suppression via session_destroy()

  • 1 opération d'écriture.

Nettoyage de la mémoire

  • 0,5 opération de lecture par tranche de 4 Ko de données du tableau à analyser pour les sessions expirées.

  • 1 opération d’écriture par élément expiré pour supprimer celui-ci.

Verrouillage de session

Le gestionnaire de session DynamoDB prend en charge le verrouillage de session pessimiste afin d'imiter le comportement du gestionnaire de session par défaut de PHP. Par défaut, cette fonctionnalité est désactivée dans le gestionnaire de session DynamoDB car elle peut entraver les performances et augmenter les coûts, en particulier lorsqu'une application accède à la session à l'aide de requêtes Ajax ou d'iframes. Demandez-vous bien si votre application nécessite le verrouillage de session avant l'activation de celle-ci.

Pour activer le verrouillage de session, paramétrez l'option 'locking' sur true lorsque vous instanciez SessionHandler.

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

Collecte des ordures

Configurez un attribut de la TTL dans votre tableau DynamoDB, à l'aide de l'attribut « expires ». Ainsi, la mémoire de vos sessions sera automatiquement nettoyée et vous n'aurez pas à le faire vous-même.

Le gestionnaire de session DynamoDB prend également en charge la collecte des déchets de session à l'aide d'une série d'opérations et. Scan BatchWriteItem En raison de la nature du fonctionnement de l'opération Scan, et afin de trouver et supprimer toutes les sessions expirées, le processus de nettoyage de la mémoire peut exiger un débit alloué élevé.

Pour cette raison, nous ne prenons pas en charge le nettoyage de la mémoire automatisé. Une meilleure pratique consiste à planifier le nettoyage de la mémoire pendant les heures creuses, lorsqu'un pic de débit consommé ne perturbera pas le reste de l'application. Par exemple, vous pouvez avoir une tâche cron nocturne déclenchant un script pour exécuter le nettoyage de la mémoire. Ce script doit faire quelque chose de similaire à ce qui suit.

$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();

Vous pouvez également utiliser l'option 'before' au sein de 'batch_config' pour introduire des délais sur les opérations BatchWriteItem qui sont effectuées par le processus de nettoyage de la mémoire. Cela augmentera le temps nécessaire à la collecte des déchets, mais cela peut vous aider à répartir les demandes effectuées par le gestionnaire de session DynamoDB afin de vous aider à rester proche ou dans les limites de votre capacité de débit allouée pendant la collecte des déchets.

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

Bonnes pratiques

  1. Créez votre tableau de sessions dans AWS la région la plus proche géographiquement de vos serveurs d'applications ou dans la même région que celles-ci. Cela garantit la latence la plus faible entre votre application et la base de données DynamoDB.

  2. Choisissez avec soin la capacité de débit alloué de votre tableau de sessions. Prenez en compte le trafic attendu pour votre application et la taille attendue de vos sessions. Vous pouvez également utiliser le mode de capacité de lecture/écriture « à la demande » pour votre tableau.

  3. Surveillez le débit consommé via la console AWS de gestion ou Amazon CloudWatch, et ajustez vos paramètres de débit selon les besoins pour répondre aux exigences de votre application.

  4. Maintenez des sessions de petite taille (idéalement inférieures à 1 Ko). Les sessions de petite taille sont plus performantes et nécessitent moins de capacité de débit alloué.

  5. N'utilisez pas le verrouillage de session, sauf si votre application le nécessite.

  6. Au lieu d'utiliser les déclencheurs de nettoyage de la mémoire de session intégrés de PHP, programmez votre nettoyage de la mémoire via une tâche cron ou autre mécanisme de planification, pour qu'elle s'exécute pendant les heures creuses. Utilisez l'option 'batch_config' à votre avantage.

Autorisations IAM requises

Pour utiliser SessionHhandler DynamoDB, vos informations d'identification configurées doivent être autorisées à utiliser la table DynamoDB que vous avez créée lors d'une étape précédente. La politique IAM suivante contient les autorisations minimales dont vous avez besoin. Pour appliquer cette politique, remplacez la valeur de la ressource par le nom de ressource Amazon (ARN) de la table que vous avez créée précédemment. Pour plus d'informations sur la création et l'attachement de politiques IAM, consultez la section Gestion des politiques IAM dans le guide de l'utilisateur 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>" } ] }