Uso do manipulador de sessão do DynamoDB com o AWS SDK for PHP versão 3 - AWS SDK for PHP

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Uso do manipulador de sessão do DynamoDB com o AWS SDK for PHP versão 3

O manipulador de sessão do DynamoDB é um manipulador de sessão personalizado para PHP que permite que os desenvolvedores usem o Amazon DynamoDB como um armazenamento de sessão. Usar o DynamoDB para armazenamento de sessão alivia problemas que ocorrem com a manipulação de sessão em um aplicativo web distribuído movendo sessões para fora do sistema de arquivos local e em um local compartilhado. O DynamoDB é rápido, escalável, fácil de configurar e lida com a replicação de seus dados automaticamente.

O manipulador de sessão do DynamoDB usa a função session_set_save_handler() para capturar operações do DynamoDB para funções de sessão nativas do PHP, permitindo uma verdadeira projeção na substituição. Isso inclui suporte para recursos, como bloqueio de sessão e coleta de resíduos, que fazem parte do manipulador de sessão padrão do PHP.

Para obter mais informações sobre o serviço do DynamoDB, consulte a Página inicial do Amazon DynamoDB.

Uso básico

Etapa 1: Registrar o manipulador

Primeiro, instancie e registre o manipulador de sessão.

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

Etapa 2. Criar uma tabela para armazenar as sessões

Para poder usar realmente o manipulador de sessão, você precisa criar uma tabela na qual armazenar as sessões. Você pode fazer isso antecipadamente usando o Console da AWS para o Amazon DynamoDB ou por meio do AWS SDK for PHP.

Ao criar essa tabela, use "id" como o nome da chave primária. Também é recomendável configurar um atributo Vida útil usando o atributo 'expirar' para se beneficiar de coleta de resíduos automática de sessões.

Etapa 3. Usar as sessões do PHP como são usadas normalmente

Quando o manipulador de sessão estiver registrado e a tabela existir, você poderá gravar e ler a partir da sessão usando o superglobal $_SESSION, da mesma forma como faz normalmente com o manipulador de sessão padrão do PHP. O manipulador de sessão do DynamoDB encapsula e abstrai as interações com o DynamoDB, permitindo que você simplesmente use as funções e a interface de sessão nativas do 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();

Configuração

Você pode configurar o comportamento do manipulador de sessão usando as seguintes opções. Todas as opções são opcionais, mas certifique-se de compreender quais são os padrões.

table_name

O nome da tabela do DynamoDB na qual armazenar as sessões. Isso é padronizado como 'sessions'.

hash_key

O nome da chave de hash na tabela de sessões do DynamoDB. Isso é padronizado como 'id'.

data_attribute

O nome do atributo na tabela de sessões do DynamoDB em que os dados da sessão são armazenados. Isso é padronizado como 'data'.

data_attribute_type

O tipo do atributo na tabela de sessões do DynamoDB em que os dados da sessão são armazenados. Isso é padronizado como 'string', mas pode ser definido como 'binary'.

session_lifetime

O tempo de vida de uma sessão inativa antes de ela ser coletada como lixo. Se não fornecido, o valor do tempo de vida real a ser usado será ini_get('session.gc_maxlifetime').

session_lifetime_attribute

O nome do atributo na tabela de sessões do DynamoDB em que o horário de expiração da sessão é armazenado. Isso é padronizado como 'expires'.

consistent_read

Se o manipulador de sessão deve usar leituras consistentes para a operação GetItem. O padrão é true.

locking

Se o bloqueio de sessão deve ser usado. O padrão é false.

batch_config

Configuração usada para exclusões em lotes durante a coleta de lixo. Essas opções são passadas diretamente para os objetos DynamoDB WriteRequestBatch. Acione manualmente a coleta de lixo por meio do SessionHandler::garbageCollect().

max_lock_wait_time

Tempo máximo (em segundos) que o manipulador de sessão deve aguardar para adquirir um bloqueio antes de desistir. O padrão é 10 e só é usado com bloqueio de sessão.

min_lock_retry_microtime

Tempo mínimo (em microssegundos) que o manipulador de sessão deve aguardar entre tentativas para adquirir um bloqueio. O padrão é 10000 e só é usado com bloqueio de sessão.

max_lock_retry_microtime

Tempo máximo (em microssegundos) que o manipulador de sessão deve aguardar entre tentativas para adquirir um bloqueio. O padrão é 50000 e só é usado com bloqueio de sessão.

Para configurar o manipulador de sessão, especifique as opções de configuração ao instanciar o manipulador. O código a seguir é um exemplo com todas as opções de configuração especificadas.

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

Preços

Além das taxas de armazenamento de dados e de transferência de dados, os custos associados ao uso do DynamoDB são calculados com base na capacidade de throughput provisionado da tabela (consulte os detalhes de preço do Amazon DynamoDB). O throughput é medido em unidades de capacidade de gravação e de leitura. A página inicial do Amazon DynamoDB diz:

Uma unidade de capacidade de leitura representa uma leitura fortemente consistente por segundo (ou duas leituras eventualmente consistentes por segundo) para itens tão grandes quanto 4 KB. Uma unidade de capacidade de gravação representa uma gravação por segundo para itens de até 1 KB.

Em última análise, o throughput e os custos necessárias para a tabela de sessões serão correlacionados com o tráfego esperado e o tamanho da sessão. A tabela a seguir explica a quantidade de operações de leitura e gravação executadas na tabela do DynamoDB para cada uma das funções de sessão.

Leitura via session_start()

  • uma operação de leitura (apenas 0,5 se consistent_read for false).

  • (Condicional) uma operação de gravação para excluir a sessão se ela estiver expirada.

Leitura via session_start() (usando bloqueio de sessão)

  • Ao menos uma operação de gravação.

  • (Condicional) operações de gravação adicionais para cada tentativa de adquirir um bloqueio na sessão. Com base no tempo de espera de bloqueio configurado e nas opções de repetição.

  • (Condicional) uma operação de gravação para excluir a sessão se ela estiver expirada.

Gravação via session_write_close()

  • Uma operação de gravação.

Exclusão via session_destroy()

  • Uma operação de gravação.

Coleta de resíduos

  • 0,5 operações de leitura por 4 KB de dados na tabela para verificar sessões expiradas.

  • Uma operação de gravação por item expirado para excluí-lo.

Bloqueio de sessão

O manipulador de sessão do DynamoDB oferece suporte ao bloqueio de sessão pessimista para imitar o comportamento do manipulador de sessão padrão do PHP. Por padrão, o manipulador de sessão do DynamoDB tem esse recurso desativado, pois ele pode se tornar um gargalo no desempenho e aumentar os custos, principalmente quando um aplicativo acessa a sessão ao usar solicitações ou iframes do Ajax. Considere cuidadosamente se o aplicativo exige o bloqueio da sessão antes de habilitá-lo.

Para habilitar o bloqueio da sessão, defina a opção 'locking' como true ao instanciar o SessionHandler.

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

Coleta de resíduos

Configure um atributo TTL em sua tabela do DynamoDB, usando o atributo "expirar". Isso fará automaticamente a coleta de lixo de suas sessões e evitará que você mesmo precise fazer coleta de lixo.

Como alternativa, o manipulador de sessão do DynamoDB oferece suporte à coleta de resíduos de sessão por meio de uma série de operações Scan e BatchWriteItem. Devido à natureza de como a operação Scan funciona e para encontrar todas as sessões expiradas e excluí-las, o processo de coleta de lixo pode exigir uma grande quantidade de throughput provisionado.

Por esse motivo, não oferecemos suporte automatizado à coleta de lixo. A melhor prática é programar a coleta de lixo para que ocorra fora do horário de pico durante uma hora quando uma intermitência do throughput consumido não interrompa o restante do aplicativo. Por exemplo, você pode ter um trabalho de cron noturno para acionar um script para executar a coleta de lixo. Esse script precisará fazer algo semelhante ao seguinte.

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

Você também pode usar a opção 'before' no 'batch_config' para introduzir atrasos nas operações BatchWriteItem que são executadas pelo processo de coleta de lixo. Isso aumentará o tempo necessário para concluir a coleta de resíduos, mas pode ajudar você a distribuir as solicitações feitas pelo manipulador de sessão do DynamoDB Session Handler para permanecer próximo ou dentro da capacidade de throughput provisionado durante a coleta de resíduos.

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

Práticas recomendadas

  1. Crie sua tabela de sessões em uma região da AWS que esteja geograficamente mais próxima ou na mesma região que os servidores de aplicativos. Isso garante a mais baixa latência entre o aplicativo e o banco de dados do DynamoDB.

  2. Escolha a capacidade de throughput provisionado de sua tabela de sessões cuidadosamente. Leve em consideração o tráfego esperado para seu aplicativo e o tamanho esperado de suas sessões. Se preferir, use o modo de capacidade de leitura/gravação "sob demanda" para a sua tabela.

  3. Monitore o throughput consumido por meio do Console de Gerenciamento da AWS ou com o Amazon CloudWatch e ajuste as configurações de throughput conforme necessário para atender às demandas de seu aplicativo.

  4. Mantenha pequeno o tamanho de suas sessões (de preferência menor que 1 KB). Sessões pequenas desempenham melhor e exigem menos capacidade de throughput provisionado.

  5. Não use o bloqueio de sessão a menos que seu aplicativo o exija.

  6. Em vez de usar os acionadores embutidos de coleta de lixo de sessão do PHP, programe a coleta de lixo por meio de um trabalho cron ou outro mecanismo de programação para execução fora de horários de pico. Use a opção 'batch_config' para seu benefício.

Permissões obrigatórias do IAM

Para usar o SessionHhandler do DynamoDB, suas credenciais configuradas devem ter permissão para usar a tabela do DynamoDB criada na etapa anterior. A seguinte política do IAM contém as permissões mínimas necessárias. Para usar essa política, substitua o valor do recurso pelo nome do recurso da Amazon (ARN) da tabela que você criou anteriormente. Para obter mais informações sobre como criar e anexar políticas do IAM, consulte Gerenciamento de políticas do IAM no Guia do usuário do 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>" } ] }