Feature flags em PHP: como alternar funcionalidades sem dor e sem deploy

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Feature flags em PHP: ative e desative funcionalidades sem deploy e sem estresse

\n\n

Imagine: você lança uma nova funcionalidade — e tudo quebra. O site cai, os clientes entram em pânico, os devops coçam a cabeça. Familiar? Agora imagine que você pode ativar essa funcionalidade para apenas 5% dos usuários, monitorar as métricas e, se algo der errado, simplesmente desligar um interruptor e reverter. Sem deploy, sem commits, sem dor de cabeça. Isso não é mágica, é feature flags em PHP.

\n\n

Feature flags (também conhecidos como feature toggles) são uma técnica que permite ativar e desativar funcionalidades da sua aplicação sem alterar o código ou fazer um novo deploy. Parece um superpoder? Pois é. Neste artigo, vamos explorar como implementar o gerenciamento de funcionalidades em PHP em projetos reais: desde um config simples até a integração com Symfony e Laravel. Vamos nessa!

\n\n

Por que usar feature flags em projetos PHP?

\n\n

Suponha que você está desenvolvendo um e-commerce em PHP. O cliente pede para adicionar um novo gateway de pagamento. Você escreve o código, testa localmente, mas em produção — surpresa: o gateway funciona de forma instável. Normalmente, isso significa: correção urgente, deploy noturno, líder de equipe nervoso. Com feature flags, é diferente. Você simplesmente desativa a flag, e o gateway antigo continua funcionando enquanto você corrige o bug com calma.

\n\n

Quando feature flags são especialmente úteis:

\n
    \n
  • Canary releases (lançamentos canários) — ative a funcionalidade para 1% dos usuários, depois 10%, depois para todos.
  • \n
  • Testes A/B — mostre funcionalidades diferentes para grupos distintos e compare a conversão.
  • \n
  • Desativação de funcionalidades quebradas — bug em produção? Desligue a flag sem reverter todo o release.
  • \n
  • Rollout gradual — libere a funcionalidade aos poucos para não sobrecarregar os servidores.
  • \n
\n\n

E o mais importante: feature flags em PHP reduzem o risco de deploy. Você para de ter medo de commitar numa sexta-feira à noite (bem, quase).

\n\n

Implementação mais simples: arquivo de configuração

\n\n

Vamos começar pelo básico. A maneira mais simples é armazenar as flags em um arquivo de configuração. Por exemplo, em formato de array PHP ou JSON.

\n\n
// config/features.php\nreturn [\n    'new_checkout' => false,\n    'dark_mode'    => true,\n    'ai_recommendations' => false,\n];\n
\n\n

Usando no código:

\n\n
// src/CheckoutService.php\n$features = require __DIR__ . '/config/features.php';\n\nif ($features['new_checkout']) {\n    // Nova lógica de checkout\n    $this->processWithNewGateway();\n} else {\n    // Lógica antiga\n    $this->processWithOldGateway();\n}\n
\n\n

A desvantagem é óbvia: para alterar uma flag, você precisa editar o arquivo no servidor. Isso é inconveniente e inseguro. Mas para projetos pequenos, serve. O importante é entender o princípio: feature flags em PHP são apenas condicionais vinculadas a um armazenamento externo.

\n\n

Nível avançado: armazenamento em banco de dados

\n\n

Conforme o projeto cresce, o arquivo de configuração se torna um gargalo. Você quer gerenciar as flags através de um painel administrativo. É aí que o banco de dados entra em cena.

\n\n

Crie uma tabela simples:

\n\n
CREATE TABLE feature_flags (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    name VARCHAR(100) UNIQUE NOT NULL,\n    enabled TINYINT(1) DEFAULT 0,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n
\n\n

E escreva um serviço simples para trabalhar com as flags:

\n\n
class FeatureFlagService\n{\n    private PDO $pdo;\n    private array $cache = [];\n\n    public function __construct(PDO $pdo)\n    {\n        $this->pdo = $pdo;\n    }\n\n    public function isEnabled(string $flagName): bool\n    {\n        if (!isset($this->cache[$flagName])) {\n            $stmt = $this->pdo->prepare(\n                'SELECT enabled FROM feature_flags WHERE name = ?'\n            );\n            $stmt->execute([$flagName]);\n            $row = $stmt->fetch(PDO::FETCH_ASSOC);\n            $this->cache[$flagName]                

Blogs

Book Recommendations