Feature flags en PHP: cómo activar funciones sin dolor ni despliegues

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Feature flags en PHP: activa funciones sin deploy ni rezos

\n\n

Imagina esto: lanzas una nueva función y todo se rompe. El sitio se cae, los clientes entran en pánico, los devops se rascan la cabeza. ¿Te suena familiar? Ahora imagina que puedes activar esa función solo para el 5% de los usuarios, observar las métricas y, si algo sale mal, simplemente desactivarla con un clic. Sin deploy, sin commits, sin dolor. Esto no es magia, son los feature flags en PHP.

\n\n

Los feature flags (también conocidos como feature toggles) son una técnica que te permite activar o desactivar funcionalidades de tu aplicación sin modificar el código ni hacer un nuevo despliegue. ¿Suena a superpoder? Pues lo es. En este artículo, veremos cómo implementar la gestión de funcionalidades en PHP en proyectos reales: desde un simple archivo de configuración hasta la integración con Symfony y Laravel. ¡Allá vamos!

\n\n

¿Por qué usar feature flags en proyectos PHP?

\n\n

Supón que estás desarrollando una tienda online en PHP. El cliente te pide agregar una nueva pasarela de pago. Escribes el código, pruebas en local, pero en producción... sorpresa: la pasarela funciona de forma inestable. Normalmente, esto significa: parche urgente, deploy nocturno, líder de equipo nervioso. Con los feature flags es diferente. Simplemente desactivas el flag y la pasarela anterior sigue funcionando mientras corriges el error con calma.

\n\n

¿Cuándo son especialmente útiles los feature flags?

\n
    \n
  • Canary releases (lanzamientos canarios) — activas la función para el 1% de los usuarios, luego para el 10%, y finalmente para todos.
  • \n
  • Pruebas A/B — muestras diferentes funcionalidades a distintos grupos y comparas la conversión.
  • \n
  • Desactivación de funcionalidades rotas — ¿un error en producción? Desactivas el flag sin revertir todo el lanzamiento.
  • \n
  • Despliegue gradual — lanzas la función poco a poco para no sobrecargar los servidores.
  • \n
\n\n

Y lo más importante: los feature flags en PHP reducen el riesgo de los despliegues. Dejas de temer hacer commits los viernes por la tarde (bueno, casi).

\n\n

Implementación básica: archivo de configuración

\n\n

Empecemos por lo básico. La forma más sencilla es almacenar los flags en un archivo de configuración, por ejemplo, en un array de PHP o en JSON.

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

Lo usamos en el código:

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

La desventaja es obvia: para cambiar un flag, necesitas editar el archivo en el servidor. No es cómodo ni seguro. Pero para proyectos pequeños, funciona. Lo importante es que entiendas el principio: los feature flags en PHP son simplemente condicionales vinculados a un almacenamiento externo.

\n\n

Nivel avanzado: almacenamiento en base de datos

\n\n

Cuando el proyecto crece, el archivo de configuración se convierte en un cuello de botella. Quieres gestionar los flags desde un panel de administración. Aquí es donde entra la base de datos.

\n\n

Creamos una tabla simple:

\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

Y escribimos un servicio sencillo para trabajar con los 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