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
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
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
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 |
|
Lettura tramite |
|
Scrittura tramite |
|
Eliminazione tramite |
|
Garbage Collection |
|
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
-
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.
-
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.
-
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.
-
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.
-
Non utilizzare il blocco delle sessioni, a meno che la tua applicazione non lo richieda.
-
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>" } ] }