

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á.

# Usando o manipulador de sessão do DynamoDB com a versão 3 AWS SDK para PHP
<a name="service_dynamodb-session-handler"></a>

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 uma aplicação web distribuída 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](http://www.php.net/manual/en/ref.session.php) 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](https://aws.amazon.com/dynamodb/).

## Uso básico
<a name="basic-usage"></a>

### Etapa 1: registrar o manipulador
<a name="step-1-register-the-handler"></a>

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
<a name="create-a-table-for-storing-your-sessions"></a>

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](https://console.aws.amazon.com/dynamodb/home) ou por meio do AWS SDK para PHP.

Ao criar essa tabela, use "id" como o nome da chave primária. Também é recomendável configurar um [atributo Vida útil](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html) usando o atributo “expira” 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
<a name="step-3-use-php-sessions-as-you-normally-would"></a>

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
<a name="configuration"></a>

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 do [ WriteRequestBatchDynamoDB](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.DynamoDb.WriteRequestBatch.html). 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
<a name="pricing"></a>

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](https://aws.amazon.com/dynamodb/pricing/)). 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()`   |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  Leitura via `session_start()` (usando bloqueio de sessão)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  Gravação via `session_write_close()`   |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  Exclusão via `session_destroy()`   |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 
|  Coleta de resíduos  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-php/v3/developer-guide/service_dynamodb-session-handler.html)  | 

## Bloqueio de sessão
<a name="ddbsh-session-locking"></a>

O manipulador de sessão do DynamoDB é compatível com o 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 uma aplicação 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
<a name="ddbsh-garbage-collection"></a>

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
<a name="best-practices"></a>

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

1. 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. Como alternativa, use o modo de Read/Write capacidade “On Demand” para sua mesa.

1. Monitore sua taxa de transferência consumida por meio do AWS Management Console ou com a Amazon CloudWatch e ajuste suas configurações de taxa de transferência conforme necessário para atender às demandas de seu aplicativo.

1. 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.

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

1. 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
<a name="required-iam-permissions"></a>

[Para usar o SessionHhandler DynamoDB, [suas credenciais configuradas](guide_credentials.md) devem ter permissão para usar a tabela do DynamoDB que você criou na etapa anterior.](#create-a-table-for-storing-your-sessions) 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](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html) no Guia do usuário do IAM.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "SessionHandler",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:Scan",
                "dynamodb:BatchWriteItem"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/table-name"
        }
    ]
}
```

------