Feature Flags en PHP : comment arrêter d'avoir peur et commencer à activer des fonctionnalités

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Feature Flags en PHP : la magie d'activer et désactiver des fonctionnalités sans déploiement

\n\n

Imaginez : vous avez écrit une nouvelle fonctionnalité — un système de recommandations super-puissant. Tout a été testé en local, mais dès que le code arrive en production, l'enfer commence. Les utilisateurs sont furieux, le taux de conversion chute, et vous annulez frénétiquement vos commits. Cela vous dit quelque chose ?

\n\n

Imaginez maintenant un autre scénario. Vous déployez la même fonctionnalité, mais elle est désactivée par défaut. Vous l'activez pour 5% des utilisateurs, surveillez les métriques, puis la déployez progressivement. Si quelque chose ne va pas — vous la désactivez d'un simple clic. Sans déploiement. Sans stress. C'est la magie des Feature Flags (aussi appelés feature toggles, drapeaux de fonctionnalités).

\n\n

Dans cet article sur PythonLib, nous allons voir comment implémenter les feature flags en PHP à partir de zéro. Vous apprendrez non seulement la théorie, mais vous obtiendrez également des extraits de code prêts à l'emploi que vous pourrez utiliser immédiatement.

\n\n

Que sont les Feature Flags et pourquoi un développeur PHP en a-t-il besoin ?

\n\n

Un Feature Flag (drapeau de fonctionnalité) est un interrupteur logiciel qui permet d'activer ou de désactiver une fonctionnalité d'une application sans modifier le code ni redéployer. En termes simples : vous écrivez le code une fois, et vous décidez à la volée de le montrer ou non à l'utilisateur.

\n\n

Top 3 des raisons d'utiliser les drapeaux de fonctionnalités en PHP :

\n
    \n
  • Déploiement sécurisé : vous pouvez déployer du code à toute heure. Si quelque chose casse — il suffit de désactiver le drapeau.
  • \n
  • Tests A/B : montrez différentes versions de l'interface à différents segments d'utilisateurs et comparez les métriques.
  • \n
  • Canary releases (déploiements canaris) : déployez une nouvelle fonctionnalité d'abord sur 1% de l'audience, puis 10%, puis 100%.
  • \n
\n\n
« Les Feature Flags sont comme un interrupteur. Vous pouvez allumer toute la pièce, ou seulement un coin. Et vous n'avez pas besoin de refaire tout le câblage à chaque fois. »
\n\n

Implémentation simple des Feature Flags en PHP

\n\n

Commençons par la version la plus basique mais fonctionnelle. Supposons que nous ayons un fichier config.php contenant tous les drapeaux :

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

Et maintenant, une simple classe wrapper pour vérifier les drapeaux :

\n\n
<?php\nclass FeatureFlagManager\n{\n    private array $features;\n\n    public function __construct(array $config)\n    {\n        $this->features = $config['features'] ?? [];\n    }\n\n    public function isEnabled(string $flag): bool\n    {\n        return $this->features[$flag] ?? false;\n    }\n}\n\n// Utilisation :\n$manager = new FeatureFlagManager(require 'config.php');\n\nif ($manager->isEnabled('dark_mode')) {\n    echo '<link rel="stylesheet" href="dark.css">';\n}\n
\n\n

L'inconvénient de cette approche est évident : pour basculer un drapeau, il faut modifier la configuration et redéployer l'application. Ce n'est pas mieux que de commiter du code. Nous avons besoin d'une gestion dynamique.

\n\n

Feature Flags dynamiques avec stockage en base de données

\n\n

Le modèle le plus courant consiste à stocker les états des drapeaux dans une base de données ou Redis. Ainsi, vous pouvez les modifier via un panneau d'administration sans redémarrer l'application.

\n\n

Structure de la table MySQL

\n\n
CREATE TABLE feature_flags (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    flag_name VARCHAR(100) UNIQUE NOT NULL,\n    is_enabled TINYINT(1) DEFAULT 0,\n    description TEXT,\n    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n);\n
\n\n

Classe pour interagir avec la base de données

\n\n
<?php\nclass DbFeatureFlags\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 $fla                

Blogs

Book Recommendations