# Redis para sessões PHP (Fase 31.8)

Objetivo: usar Redis como armazenamento de sessões PHP na API v2, em vez de arquivos em `/tmp`, para melhor performance e escalabilidade (múltiplas instâncias, persistência).

Ref: ideias-melhorias.md §11; docs/v2/11-backup-restore.md.

## Pré-requisitos

- Extensão PHP **redis** instalada (`pecl install redis` ou pacote do sistema, ex.: `php-redis`).
- Servidor Redis acessível (localhost ou variável de ambiente).

## Configuração

### Opção 1: Variável de ambiente (recomendado)

Defina `REDIS_DSN` no ambiente. Exemplos:

- `tcp://127.0.0.1:6379`
- `tcp://redis:6379` (Docker)
- `tcp://127.0.0.1:6379?database=1` (database Redis 1)

O entry point da API (`api/public/index.php`) verifica `REDIS_DSN` antes de iniciar a sessão. Se estiver definido e a extensão `redis` estiver carregada, as sessões passam a ser salvas no Redis.

### Opção 2: php.ini

```ini
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
```

### Opção 3: Runtime (antes de session_start)

```php
if (extension_loaded('redis') && getenv('REDIS_DSN')) {
    ini_set('session.save_handler', 'redis');
    ini_set('session.save_path', getenv('REDIS_DSN'));
}
```

## Comportamento na API v2

- Se `REDIS_DSN` **não** estiver definido ou a extensão **redis** não estiver carregada, as sessões continuam em arquivo (path padrão ou `session_save_path` já configurado em `api/public/index.php`).
- Nenhuma alteração é necessária no código de autenticação ou carrinho; apenas o backend de armazenamento da sessão muda.

## Docker

No `docker-compose.yml`, adicione o serviço Redis e a variável para a API:

```yaml
services:
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
  api:
    environment:
      REDIS_DSN: tcp://redis:6379
```

## Verificação

- Com Redis ativo, sessões passam a aparecer no Redis (ex.: `redis-cli KEYS "PHPREDIS_SESSION:*"`).
- Logout e login devem funcionar normalmente; múltiplas instâncias da API compartilham as mesmas sessões quando apontam para o mesmo Redis.

## Segurança

- Restrinja acesso ao Redis apenas à rede interna (firewall, rede privada).
- Opcional: use `auth` na connection string se o Redis exigir senha: `tcp://user:pass@host:6379` (conforme suporte da extensão).
