Verwenden des DynamoDB-Sitzungshandlers mit Version 3 AWS SDK for PHP - AWS SDK for PHP

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden des DynamoDB-Sitzungshandlers mit Version 3 AWS SDK for PHP

Der DynamoDB Session Handler ist ein benutzerdefinierter Session-Handler für PHP, der es Entwicklern ermöglicht, Amazon DynamoDB als Sitzungsspeicher zu verwenden. Die Verwendung von DynamoDB als Sitzungsspeicher behebt Probleme, die bei der Sitzungsverarbeitung in einer verteilten Webanwendung auftreten, indem Sitzungen aus dem lokalen Dateisystem an einen gemeinsam genutzten Speicherort verschoben werden. DynamoDB ist schnell, skalierbar, einfach einzurichten und wickelt die Replikation Ihrer Daten automatisch ab.

Der DynamoDB-Sitzungshandler verwendet die session_set_save_handler() Funktion, um DynamoDB-Operationen in die systemeigenen Sitzungsfunktionen von PHP einzubinden, um einen echten Ersatz zu ermöglichen. Dies beinhaltet die Unterstützung von Funktionen wie Sitzungssperren und Speicherbereinigung, die Teil des standardmäßigen Sitzungshandlers von PHP sind.

Weitere Informationen zum DynamoDB-Service finden Sie auf der Amazon DynamoDB DynamoDB-Homepage.

Grundlegende Verwendung

Schritt 1: Registrieren Sie den Handler

Zuerst instanziieren und registrieren Sie den Sitzungs-Handler.

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

Schritt 2. Erstellen Sie eine Tabelle zum Speichern Ihrer Sitzungen

Bevor Sie den Sitzungs-Handler tatsächlich verwenden können, müssen Sie eine Tabelle erstellen, in der die Sitzungen gespeichert werden. Sie können dies im Voraus tun, indem Sie die AWSKonsole für Amazon DynamoDB verwenden oder die. AWS SDK for PHP

Beim Erstellen dieser Tabelle wählen Sie „id“ als Name des Primärschlüssels. Außerdem wird empfohlen, ein Time to Live-Attribut einzurichten, und zwar anhand des Attributs „expires“. So profitieren Sie von der Sitzungsspeicherbereinigung.

Schritt 3. Verwenden Sie PHP-Sitzungen wie gewohnt

Sobald der Sitzungshandler registriert ist und die Tabelle existiert, können Sie mit der superglobalen Variable $_SESSION in die Sitzung schreiben und aus ihr lesen, genau wie Sie es normalerweise mit dem Standard-Sitzungshandler von PHP tun. Der DynamoDB Session Handler kapselt und abstrahiert die Interaktionen mit DynamoDB und ermöglicht es Ihnen, einfach die nativen Sitzungsfunktionen und die Schnittstelle von PHP zu verwenden.

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

Konfiguration

Sie können das Verhalten des Sitzungs-Handlers mithilfe der folgenden Optionen konfigurieren. Alle Optionen sind optional, aber Sie sollten sicher sein, dass Sie die Standardeinstellungen kennen.

table_name

Der Name der DynamoDB-Tabelle, in der die Sitzungen gespeichert werden sollen. Der Standardwert ist 'sessions'.

hash_key

Der Name des Hash-Schlüssels in der DynamoDB-Sitzungstabelle. Der Standardwert ist 'id'.

data_attribute

Der Name des Attributs in der DynamoDB-Sitzungstabelle, in der die Sitzungsdaten gespeichert sind. Der Standardwert ist 'data'.

data_attribute_type

Der Typ des Attributs in der DynamoDB-Sitzungstabelle, in der die Sitzungsdaten gespeichert sind. Dies ist standardmäßig 'string', kann aber optional als 'binary' festgelegt werden.

session_lifetime

Die Lebensdauer einer inaktiven Sitzung, bevor der Speicher bereinigt werden soll. Wenn sie nicht angegeben ist, wird ini_get('session.gc_maxlifetime') als Wert für die Lebensdauer verwendet.

session_lifetime_attribute

Der Name des Attributs in der DynamoDB-Sitzungstabelle, in dem die Ablaufzeit der Sitzung gespeichert ist. Der Standardwert ist 'expires'.

consistent_read

Ob der Sitzungs-Handler konsistente Lesevorgänge für die GetItem-Operation verwenden soll. Der Standardwert ist true.

locking

Ob Sitzungssperren verwendet werden sollen. Der Standardwert ist false.

batch_config

Konfiguration zum Stapellöschen bei der Speicherbereinigung. Diese Optionen werden direkt an DynamoDB-Objekte WriteRequestBatch übergeben. Lösen Sie die Speicherbereinigung manuell über SessionHandler::garbageCollect() aus.

max_lock_wait_time

Maximale Zeit (in Sekunden), wie lange der Sitzungs-Handler warten soll, bis ihm eine Sperre erteilt wird, bevor er aufgibt. Die Standardwert ist 10 und wird nur für die Sitzungssperre verwendet.

min_lock_retry_microtime

Minimale Zeit (in Mikrosekunden), wie lange der Sitzungs-Handler zwischen den Versuchen warten soll, eine Sperre zu erhalten. Die Standardwert ist 10000 und wird nur für die Sitzungssperre verwendet.

max_lock_retry_microtime

Maximale Zeit (in Mikrosekunden), wie lange der Sitzungs-Handler zwischen den Versuchen warten soll, eine Sperre zu erhalten. Die Standardwert ist 50000 und wird nur für die Sitzungssperre verwendet.

Zur Konfiguration des Session Handlers geben Sie bei der Instanziierung des Handlers die Konfigurationsoptionen an. Der folgende Code ist ein Beispiel mit allen Konfigurationsoptionen.

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

Preisgestaltung

Abgesehen von den Gebühren für Datenspeicherung und Datenübertragung werden die mit der Nutzung von DynamoDB verbundenen Kosten auf der Grundlage der bereitgestellten Durchsatzkapazität Ihrer Tabelle berechnet (siehe Preisdetails zu Amazon DynamoDB). Der Durchsatz wird in Einheiten der Schreib- und Lesekapazität gemessen. Auf der Amazon DynamoDB DynamoDB-Homepage heißt es:

Eine Lesekapazitätseinheit entspricht einem Strongly Consistent-Lesevorgang pro Sekunde oder zwei Eventually Consistent-Lesevorgängen pro Sekunde für Elemente mit einer Größe von bis zu 4 KB. Eine Schreibkapazitätseinheit entspricht einem Schreibvorgang pro Sekunde für Elemente von bis zu 1 KB.

Letztendlich korrelieren der Durchsatz und die Kosten für Ihre Sitzungstabelle mit dem erwarteten Datenverkehr und der Sitzungsgröße. In der folgenden Tabelle wird die Anzahl der Lese- und Schreiboperationen erläutert, die in Ihrer DynamoDB-Tabelle für jede der Sitzungsfunktionen ausgeführt werden.

Lesen über session_start()

  • 1 Lesevorgang (nur 0,5, wenn consistent_read gleich false ist).

  • (Bedingt) 1 Schreibvorgang zum Löschen der Sitzung, falls sie abgelaufen ist.

Lesen über session_start() (mit Sitzungssperre)

  • Mindestens 1 Schreibvorgang.

  • (Bedingt) Zusätzliche Schreibvorgänge für jeden Versuch, eine Sitzungssperre zu erhalten. Basierend auf der konfigurierte Wartezeit für die Sperre und Wiederholungsoptionen.

  • (Bedingt) 1 Schreibvorgang zum Löschen der Sitzung, falls sie abgelaufen ist.

Schreiben über session_write_close()

  • 1 Schreibvorgang.

Löschen über session_destroy()

  • 1 Schreibvorgang.

Speicherbereinigung

  • 0,5 Lesevorgänge pro 4 KB Daten in der Tabelle, um nach abgelaufenen Sitzungen zu suchen.

  • 1 Schreibvorgang pro abgelaufenem Element, um dieses zu löschen.

Sperren von Sitzungen

Der DynamoDB Session Handler unterstützt pessimistisches Sperren von Sitzungen, um das Verhalten des Standard-Session-Handlers von PHP nachzuahmen. Standardmäßig ist diese Funktion im DynamoDB-Sitzungshandler deaktiviert, da sie zu einem Leistungsengpass werden und die Kosten in die Höhe treiben kann, insbesondere wenn eine Anwendung über Ajax-Anfragen oder Iframes auf die Sitzung zugreift. Überlegen Sie sorgfältig, ob Ihre Anwendung eine Sitzungssperre benötigt, bevor Sie diese aktivieren.

Um die Sitzungssperre zu aktivieren, setzen Sie die 'locking'-Option auf true, wenn Sie den SessionHandler instanziieren.

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

Müllabfuhr

Richten Sie in Ihrer DynamoDB-Tabelle mit dem Attribut „expires“ ein TTL-Attribut ein. Dies bereinigt Ihre Sitzungen automatisch und erspart Ihnen, sie selbst entfernen zu müssen.

Alternativ unterstützt der DynamoDB-Sitzungshandler die Sitzungsbereinigung mithilfe einer Reihe von Scan Und-Operationen. BatchWriteItem Aufgrund der Art, wie dieScan-Operation funktioniert, und um alle abgelaufenen Sitzungen zu finden und zu löschen, kann der Speicherbereinigungsprozess eine Menge Durchsatz erfordern.

Aus diesem Grund unterstützen wir keine automatisierte Speicherbereinigung. Eine bessere Praxis ist es, die Speicherbereinigung so zu planen, dass sie außerhalb der Hauptverkehrszeiten stattfindet, in der eine Erhöhung des verbrauchten Durchsatzes den Rest der Anwendung nicht stört. Beispielsweise könnte ein nächtlicher Cron-Job ein Skript zur Ausführung der Speicherbereinigung auslösen. Dieses Skript müsste etwa Folgendes erledigen.

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

Sie können auch die 'before'-Option mit 'batch_config' verwenden, um Verzögerungen für die BatchWriteItem-Operationen anzuwenden, die von der Speicherbereinigung ausgeführt werden. Dadurch verlängert sich die Zeit, die für die Garbage-Collection benötigt wird, aber es kann Ihnen helfen, die Anfragen des DynamoDB-Sitzungshandlers so zu verteilen, dass Sie während der Garbage-Collection in der Nähe oder innerhalb Ihrer bereitgestellten Durchsatzkapazität bleiben.

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

Bewährte Methoden

  1. Erstellen Sie Ihre Sitzungstabelle in einer AWS Region, die Ihren Anwendungsservern geografisch am nächsten liegt oder sich in derselben Region wie diese befindet. Dadurch wird die niedrigste Latenz zwischen Ihrer Anwendung und der DynamoDB-Datenbank gewährleistet.

  2. Wählen Sie die bereitgestellte Durchsatzkapazität für Ihre Sitzungstabelle sehr sorgfältig aus. Berücksichtigen Sie den erwarteten Datenverkehr zu Ihrer Anwendung und die erwartete Größe Ihrer Sitzungen. Alternativ verwenden Sie für Ihre Tabelle den Lese-/Schreibkapazitäts-Modus „On-Demand“.

  3. Überwachen Sie Ihren verbrauchten Durchsatz über die AWS Management Console oder mit Amazon und passen Sie Ihre Durchsatzeinstellungen nach Bedarf an CloudWatch, um den Anforderungen Ihrer Anwendung gerecht zu werden.

  4. Halten Sie die Größe Ihrer Sitzungen klein (im Idealfall weniger als 1 KB). Kleine Sitzungen sind leistungsfähiger und erfordern weniger Durchsatzkapazität.

  5. Verwenden Sie keine Sitzungssperren, es sei denn, Ihre Anwendung benötigt sie.

  6. Anstatt die eingebauten Auslöser für die Speicherbereinigung von Sitzungen in PHP zu verwenden, planen Sie Ihre Speicherbereinigung über einen Cron-Job oder einen anderen Scheduling-Mechanismus so ein, dass sie außerhalb der Stoßzeiten stattfindet. Nutzen Sie die 'batch_config'-Option.

Erforderliche IAM-Berechtigungen

Um DynamoDB verwenden zu können SessionHhandler, müssen Ihre konfigurierten Anmeldeinformationen berechtigt sein, die DynamoDB-Tabelle zu verwenden, die Sie in einem vorherigen Schritt erstellt haben. Die folgende IAM-Richtlinie enthält die Mindestberechtigungen, die Sie benötigen. Um diese Richtlinie zu verwenden, ersetzen Sie den Ressourcenwert durch den Amazon-Ressourcennamen (ARN) der Tabelle, die Sie zuvor erstellt haben. Weitere Informationen zum Erstellen und Anhängen von IAM-Richtlinien finden Sie unter Verwaltung von IAM-Richtlinien im IAM-Benutzerhandbuch.

{ "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>" } ] }