Feature flags em PHP: ative e desative funcionalidades sem deploy e sem estresse
\n\nImagine: 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\nFeature 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\nPor que usar feature flags em projetos PHP?
\n\nSuponha 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\nQuando 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
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\nImplementação mais simples: arquivo de configuração
\n\nVamos 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\nUsando 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\nA 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\nNível avançado: armazenamento em banco de dados
\n\nConforme 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\nCrie uma tabela simples:
\n\nCREATE 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\nE escreva um serviço simples para trabalhar com as flags:
\n\nclass 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]