--- name: Pitfalls em produção — OPcache + .env + AutoMigrate description: Três armadilhas críticas do servidor cPanel que tomam o site fora do ar ou impedem deploys. Sempre verificar. type: feedback originSessionId: 86576285-fa7a-44f0-8ed3-9a88bcd27a8e --- ## Pitfall 1 — OPcache cheio bloqueia novos deploys **Sintoma**: arquivo PHP atualizado via pscp mas comportamento antigo persiste. **Causa**: OPcache do PHP tem memória limitada; quando enche, **não evicta automaticamente** — `cache_full: true`, `restart_pending: true`. **Como verificar**: `php -r 'var_dump(opcache_get_status(false));'` ou criar `_r.php` com ` /home/agmusiccom/public_html/sistema.agmusic/_r.php chown agmusiccom:agmusiccom /home/agmusiccom/public_html/sistema.agmusic/_r.php curl -sk "https://sistema.agmusic.com.br/_r.php" >/dev/null rm -f /home/agmusiccom/public_html/sistema.agmusic/_r.php ``` **Why**: PHP-FPM mantém bytecode em memória; sem reset, cliente nunca vê o código novo. **How to apply**: SEMPRE rodar opcache_reset após qualquer deploy de `.php` em produção. --- ## Pitfall 2 — .env quebra com valor não-quoteado contendo espaços **Sintoma**: HTTP 500 em TODAS as rotas, sem mensagem clara nos logs do CI4 (erro acontece antes do boot). **Causa**: parser do `.env` do CI4 (vlucas/phpdotenv) interpreta `KEY = valor com espaço` como erro. **Exemplo real (2026-05-05)**: adicionar `BRADESCO_RAZAO_SOCIAL = AG ESCOLA DE MUSICA LTDA` derrubou o site inteiro por 5 minutos. **Solução**: SEMPRE usar aspas para valores com espaços: ``` BRADESCO_RAZAO_SOCIAL = "AG ESCOLA DE MUSICA LTDA" ✅ ``` **Recovery**: o servidor mantém backups `.env.bak.YYYYMMDD-HHMMSS` quando criados. Restaurar com `cp` resolve em segundos. **Why**: o boot do framework faz parse do .env como primeiro passo; falha aqui = nenhuma rota responde. **How to apply**: SEMPRE fazer `cp .env .env.bak.$(date +%Y%m%d-%H%M%S)` antes de mexer, e citar valores com espaços. --- ## Pitfall 3 — AutoMigrate roda sozinho e quebra com migration já aplicada manualmente **Sintoma**: HTTP 500 com `mysqli_sql_exception: Duplicate column name`. **Causa**: CodeIgniter 4 tem AutoMigrate ativo. Se uma migration foi aplicada manualmente via SQL (sem registrar na tabela `migrations`), o AutoMigrate tenta rodar de novo no boot e a query SQL falha. **Como detectar**: log mostra `❌ AutoMigrate: Duplicate column name 'X'`. **Como fixar**: registrar manualmente a migration na tabela `migrations`: ```php $pdo->prepare("INSERT INTO migrations (version, class, `group`, namespace, time, batch) VALUES (?, ?, 'default', 'App', UNIX_TIMESTAMP(), ?)") ->execute(["2026-05-05-100000", "App\\Database\\Migrations\\AddAuthModeToBoletoConfig", 37]); ``` **ATENÇÃO**: se usar shell, escape de backslashes pra namespace é trabalhoso — melhor usar PHP direto. **Why**: AutoMigrate roda no boot pra ambientes sem manutenção, mas atrapalha quando você aplicou DDL manualmente. **How to apply**: SEMPRE que aplicar migration via SQL puro em prod, registrar a entrada em `migrations` table com a class FQCN correta.