Utilizzo del gestore di sessione DynamoDB con la versione 3 AWS SDK for PHP - AWS SDK for PHP

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo del gestore di sessione DynamoDB con la versione 3 AWS SDK for PHP

Il DynamoDB Session Handler è un gestore di sessioni personalizzato per PHP che consente agli sviluppatori di utilizzare Amazon DynamoDB come archivio di sessioni. L'utilizzo di DynamoDB per l'archiviazione delle sessioni allevia i problemi che si verificano con la gestione delle sessioni in un'applicazione Web distribuita spostando le sessioni dal file system locale a una posizione condivisa. DynamoDB è veloce, scalabile, facile da configurare e gestisce automaticamente la replica dei dati.

Il DynamoDB Session Handler utilizza la session_set_save_handler() funzione per agganciare le operazioni DynamoDB alle funzioni di sessione native di PHP per consentire un vero calo delle sostituzioni. È incluso il supporto per caratteristiche quali blocco delle sessioni e garbage collection, che fanno parte del gestore di sessione predefinito di PHP.

Per ulteriori informazioni sul servizio DynamoDB, consulta la home page di Amazon DynamoDB.

Utilizzo di base

Fase 1: Registrare il gestore

Per prima cosa, crea istanze e registra il gestore di sessione.

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

Fase 2. Crea una tabella per archiviare le tue sessioni

Prima di poter utilizzare il gestore di sessione devi creare una tabella in cui archiviare le sessioni. Puoi farlo in anticipo utilizzando la AWSConsole per Amazon DynamoDB o utilizzando il. AWS SDK for PHP

Quando crei questa tabella utilizza "id" come nome della chiave primaria. Inoltre è consigliabile configurare un attributo Time To Live utilizzando l'attributo "expires" per trarre vantaggio dalla garbage collection automatica di sessioni.

Fase 3. Usa le sessioni PHP come faresti normalmente

Una volta che il gestore di sessione è stato registrato e la tabella è stata creata, è possibile eseguire operazioni di lettura e scrittura con la sessione utilizzando la variabile superglobale $_SESSION, in modo analogo a quanto avviene normalmente con il gestore di sessione predefinito di PHP. Il DynamoDB Session Handler incapsula e riassume le interazioni con DynamoDB e consente di utilizzare semplicemente le funzioni e l'interfaccia di sessione native di 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();

Configurazione

È possibile configurare il comportamento del gestore di sessione utilizzando le seguenti opzioni. Tutte le opzioni sono facoltative, ma assicurati di comprendere quali sono le impostazioni predefinite.

table_name

Il nome della tabella DynamoDB in cui archiviare le sessioni. L'impostazione predefinita di questa opzione è 'sessions'.

hash_key

Il nome della chiave hash nella tabella delle sessioni di DynamoDB. L'impostazione predefinita di questa opzione è 'id'.

data_attribute

Il nome dell'attributo nella tabella delle sessioni di DynamoDB in cui sono archiviati i dati della sessione. L'impostazione predefinita di questa opzione è 'data'.

data_attribute_type

Il tipo di attributo nella tabella delle sessioni di DynamoDB in cui sono archiviati i dati della sessione. L'impostazione predefinita di questa opzione è 'string', ma può essere facoltativamente impostato su 'binary'.

session_lifetime

La durata di una sessione inattiva prima che venga sottoposta al processo di garbage collection. Se non viene fornito, il valore della durata che verrà utilizzato è ini_get('session.gc_maxlifetime').

session_lifetime_attribute

Il nome dell'attributo nella tabella delle sessioni di DynamoDB in cui è memorizzata l'ora di scadenza della sessione. L'impostazione predefinita di questa opzione è 'expires'.

consistent_read

Se il gestore di sessione dovrebbe utilizzare letture consistenti per l'operazione GetItem. Il valore predefinito è true.

locking

Se utilizzare il blocco delle sessioni. Il valore predefinito è false.

batch_config

Configurazione utilizzata per le eliminazioni in batch durante il processo di garbage collection. Queste opzioni vengono passate direttamente agli oggetti WriteRequestBatchDynamoDB. Attiva manualmente il processo di garbage collection tramite SessionHandler::garbageCollect().

max_lock_wait_time

Tempo massimo (in secondi) che il gestore di sessione dovrebbe attendere per acquisire un blocco prima di desistere. L'impostazione predefinita per questa opzione è 10 e viene utilizzata solo con il blocco della sessione.

min_lock_retry_microtime

Tempo minimo (in microsecondi) che il gestore di sessione dovrebbe attendere tra i tentativi di acquisire un blocco. L'impostazione predefinita per questa opzione è 10000 e viene utilizzata solo con il blocco della sessione.

max_lock_retry_microtime

Tempo massimo (in microsecondi) che il gestore di sessione dovrebbe attendere tra i tentativi di acquisire un blocco. L'impostazione predefinita per questa opzione è 50000 e viene utilizzata solo con il blocco della sessione.

Per configurare il Gestore di sessione, specifica le opzioni di configurazione durante la creazione di istanze per il gestore. Il codice seguente è un esempio con tutte le opzioni di configurazione specificate.

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

Prezzi

Oltre ai costi di archiviazione e trasferimento dei dati, i costi associati all'utilizzo di DynamoDB vengono calcolati in base alla capacità di throughput fornita della tabella (consulta i dettagli sui prezzi di Amazon DynamoDB). Il throughput viene misurato in unità di capacità di scrittura e lettura. La home page di Amazon DynamoDB dice:

Un'unità di capacità di lettura equivale a una lettura fortemente consistente al secondo (o a due letture consistenti finali al secondo) per elementi di dimensioni fino a 4 KB. Un'unità di capacità di scrittura equivale a una scrittura al secondo per elementi di dimensioni fino a 1 KB.

In ultima analisi, il throughput e i costi richiesti per la tabella delle sessioni saranno correlati alle previsioni del traffico e delle dimensioni delle sessioni. La tabella seguente spiega la quantità di operazioni di lettura e scrittura eseguite sulla tabella DynamoDB per ciascuna delle funzioni di sessione.

Lettura tramite session_start()

  • 1 operazione di lettura (solo 0,5 se consistent_read è false).

  • (Condizionale) 1 operazione di scrittura per eliminare la sessione se è scaduta.

Lettura tramite session_start() (utilizzando il blocco della sessione)

  • Un minimo di 1 operazione di scrittura.

  • (Condizionale) Ulteriori operazioni di scrittura per ogni tentativo di acquisizione di un blocco della sessione. Sulla base di un tempo di attesa per il blocco configurato e di opzioni per nuovi tentativi.

  • (Condizionale) 1 operazione di scrittura per eliminare la sessione se è scaduta.

Scrittura tramite session_write_close()

  • 1 operazione di scrittura.

Eliminazione tramite session_destroy()

  • 1 operazione di scrittura.

Garbage Collection

  • 0,5 operazioni di lettura per 4 KB di dati nella tabella per rilevare sessioni scadute.

  • 1 operazione di scrittura per elemento scaduto per eliminarlo.

Blocco della sessione

Il gestore di sessione DynamoDB supporta il blocco pessimistico delle sessioni per imitare il comportamento del gestore di sessione predefinito di PHP. Per impostazione predefinita, il DynamoDB Session Handler ha questa funzionalità disattivata perché può diventare un ostacolo alle prestazioni e far aumentare i costi, specialmente quando un'applicazione accede alla sessione quando utilizza richieste Ajax o iframe. Valuta attentamente se l'applicazione richiede il blocco della sessione prima di abilitarla.

Per abilitare il blocco della sessione, imposta l'opzione 'locking' su true quando crei istanze per SessionHandler.

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

Raccolta dei rifiuti

Configura un attributo TTL nella tabella DynamoDB utilizzando l'attributo "expires". In questo modo, il processo garbage collection delle sessioni verrà eseguito automaticamente.

In alternativa, il gestore di sessione DynamoDB supporta la raccolta dei rifiuti di sessione utilizzando una serie di operazioni and. Scan BatchWriteItem Per via della natura dell'operazione Scan e al fine di trovare tutte le sessioni scadute e rimuoverle, il processo di garbage collection può richiedere una notevole capacità di throughput assegnata.

Per questo motivo, la garbage collection automatizzata non è supportata. Si consiglia di pianificare il processo di garbage collection durante gli orari meno intensi, in modo che l'incremento di throughput non abbia ripercussioni sul resto dell'applicazione. Ad esempio, si potrebbe utilizzare un processo cron notturno che attivi uno script per l'esecuzione del processo di garbage collection. Il contenuto dello script dovrebbe essere simile a quello riportato di seguito.

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

È inoltre possibile utilizzare l'opzione 'before' all'interno di 'batch_config' per includere ritardi sulle operazioni BatchWriteItem eseguite dal processo di garbage collection. Ciò aumenterà il tempo necessario per completare la raccolta dei rifiuti, ma può aiutarti a distribuire le richieste fatte dal gestore di sessione DynamoDB per aiutarti a rimanere vicino o entro la capacità di throughput assegnata durante la raccolta dei rifiuti.

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

Best practice

  1. Crea la tabella delle sessioni in una AWS regione geograficamente più vicina o nella stessa regione dei tuoi server delle applicazioni. Ciò garantisce la latenza più bassa tra l'applicazione e il database DynamoDB.

  2. Scegli attentamente la capacità di throughput assegnata della tabella delle sessioni. Tieni in considerazione il traffico previsto verso la tua applicazione e le probabili dimensioni delle sessioni. In alternativa, utilizza la modalità di capacità in lettura/scrittura "on demand" per la tabella.

  3. Monitora il throughput consumato tramite la Console di AWS gestione o con Amazon CloudWatch e modifica le impostazioni di throughput secondo necessità per soddisfare le esigenze della tua applicazione.

  4. Mantieni le dimensioni delle sessioni ridotte (preferibilmente inferiori a 1 KB). Sessioni di dimensioni ridotte garantiscono prestazioni migliori e richiedono una capacità di throughput assegnata inferiore.

  5. Non utilizzare il blocco delle sessioni, a meno che la tua applicazione non lo richieda.

  6. Invece di utilizzare trigger per la garbage collection delle sessioni integrati in PHP, pianifica la garbage collection utilizzando un processo cron o un altro meccanismo di pianificazione in modo che venga eseguita durante gli orari meno intensi. Sfrutta i vantaggi dell'opzione 'batch_config'.

Autorizzazioni IAM richieste

Per utilizzare SessionHhandler DynamoDB, le credenziali configurate devono disporre dell'autorizzazione per utilizzare la tabella DynamoDB creata in un passaggio precedente. La seguente policy IAM contiene le autorizzazioni minime necessarie. Per utilizzare questa politica, sostituisci il valore Resource con l'Amazon Resource Name (ARN) della tabella che hai creato in precedenza. Per ulteriori informazioni sulla creazione e l'associazione delle policy IAM, consulta Managing IAM Policies nella IAM User Guide.

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