Utilizzo del gestore di sessione DynamoDB conAWS SDK for PHPVersione 3 - 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 conAWS SDK for PHPVersione 3

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

Il gestore di sessione DynamoDB utilizza ilsession_set_save_handler()funzione per collegare le operazioni DynamoDB a PHPfunzioni per sessioni nativeper consentire un vero calo di sostituzione. È 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 sezioneHome page di Amazon DynamoDB.

Utilizzo di base

Fase 1: Registra il gestore

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

use Aws\DynamoDb\SessionHandler; $sessionHandler = SessionHandler::fromClient($dynamoDb, [ 'table_name' => 'sessions' ]); $sessionHandler->register();

Fase 2. Creazione di una tabella per l'archiviazione delle sessioni

Prima di poter utilizzare il gestore di sessione devi creare una tabella in cui archiviare le sessioni. Puoi farlo in anticipo usando ilAWSConsole per Amazon DynamoDB, o utilizzando ilAWS 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. Utilizzo di sessioni PHP come di consueto

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 Gestore di sessione DynamoDB incapsula e astrae le interazioni con DynamoDB e consente di utilizzare in modo semplice le funzioni per sessioni native e l'interfaccia 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

l 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

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

data_attribute_type

Il tipo dell'attributo nella tabella delle sessioni di DynamoDB in cui sono memorizzati i dati di 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

l nome dell'attributo nella tabella delle sessioni di DynamoDB in cui è memorizzata la 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 di default è true.

locking

Se utilizzare il blocco delle sessioni. Il valore di default è false.

batch_config

Configurazione utilizzata per le eliminazioni in batch durante il processo di garbage collection. Queste opzioni vengono trasferite direttamente negli oggetti DynamoDB WriteRequestBatch. 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

A parte le tariffe per lo storage e il trasferimento dei dati, i costi associati all'utilizzo di DynamoDB sono calcolati in base alla capacità di throughput assegnata della tua tabella (consulta laDettagli dei prezzi di Amazon DynamoDB). Il throughput viene misurato in unità di capacità di scrittura e lettura. Nella home page di Amazon DynamoDB si legge:

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 indica la quantità di operazioni di lettura e scrittura eseguite sulla tua tabella DynamoDB per ognuna delle funzioni della 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 della sessione pessimistico per simulare il comportamento del gestore di sessione predefinito di PHP. Per impostazione predefinita, il gestore di sessione DynamoDB dispone di questa funzionedisattivazione diin quanto può creare colli di bottiglia delle prestazioni e un aumento dei costi, soprattutto quando un'applicazione accede alla sessione mentre si utilizzano 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, ]);

Garbage Collection

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 il processo garbage collection per le sessioni mediante l'utilizzo di una serie diScaneBatchWriteItemoperazioni. 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 il completamento della garbage collection, ma può essere utile per distribuire le richieste effettuate dal Gestore di sessione DynamoDB, in modo da mantenersi nei limiti o in prossimità dei limiti della capacità di throughput assegnata durante il processo di garbage collection.

$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 unAWSRegione geograficamente più vicina o nella stessa regione dei server delle applicazioni. Ciò garantisce una latenza minima 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 attraversoAWSConsole di gestione o con Amazon CloudWatch e modifica le impostazioni di throughput secondo necessità per soddisfare le esigenze dell'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 DynamoDB SessionHhandler,credenzialideve disporre dell'autorizzazione per utilizzare la tabella DynamoDBhai creato in una fase precedente. La seguente policy IAM include le autorizzazioni minime necessarie. Per utilizzare questa policy, sostituisci il valore della risorsa con l'ARN (Amazon Resource Name) della tabella creata in precedenza. Per ulteriori informazioni sulla creazione e sull'applicazione di policy IAM, consultaGestione di policy IAMnella Guida per l'utente di 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>" } ] }