أعلام الميزات في PHP: سحر تشغيل وإيقاف الوظائف بدون نشر
\n\nتخيل: لقد كتبت ميزة جديدة - نظام توصيات فائق. تم اختبار كل شيء على جهازك المحلي، ولكن بمجرد وصول الكود إلى بيئة الإنتاج، تبدأ الفوضى. المستخدمون غاضبون، معدل التحويل ينخفض، وأنت تتراجع عن التغييرات بشكل محموم. هل يبدو الأمر مألوفًا؟
\n\nوالآن تخيل سيناريو آخر. تقوم بنشر نفس الميزة، لكنها معطلة افتراضيًا. تقوم بتفعيلها لـ 5% من المستخدمين، تراقب المقاييس، ثم تنشرها أكثر. إذا حدث خطأ ما - فقط قم بتعطيلها بنقرة واحدة. بدون نشر. بدون توتر. هذا هو سحر أعلام الميزات (تُعرف أيضًا بمفاتيح الميزات، أعلام الوظائف).
\n\nفي هذه المقالة على PythonLib، سنشرح كيفية دمج أعلام الميزات في PHP من الصفر. ستتعلم ليس فقط النظرية، بل ستحصل أيضًا على أجزاء جاهزة من الكود يمكنك أخذها الآن.
\n\nما هي أعلام الميزات ولماذا يحتاجها مطور PHP؟
\n\nعلم الميزة (فيشة فلاج) هو مفتاح برمجي يسمح لك بتشغيل أو إيقاف وظائف التطبيق دون تغيير الكود أو إعادة النشر. ببساطة: تكتب الكود مرة واحدة، وتقرر ما إذا كنت تريد عرضه للمستخدم أم لا بشكل فوري.
\n\nأفضل 3 أسباب لاستخدام أعلام الوظائف في PHP:
\n- \n
- النشر الآمن: يمكنك نشر الكود في أي وقت من اليوم. إذا حدث خطأ - فقط قم بإيقاف العلم. \n
- اختبار A/B: عرض إصدارات مختلفة من الواجهة لشرائح مختلفة من المستخدمين ومقارنة المقاييس. \n
- الإصدارات التجريبية (Canary releases): نشر الميزة الجديدة أولاً على 1% من الجمهور، ثم 10%، ثم 100%. \n
«أعلام الميزات تشبه مفتاح الضوء. يمكنك تشغيله للغرفة بأكملها، أو لزاوية واحدة فقط. ولست بحاجة إلى إعادة توصيل الأسلاك في كل مرة».\n\n
أبسط تطبيق لأعلام الميزات في PHP
\n\nلنبدأ بأبسط خيار عملي. لنفترض أن لدينا ملف config.php يخزن جميع الأعلام:
<?php\n// config.php\nreturn [\n 'features' => [\n 'new_checkout' => false,\n 'dark_mode' => true,\n 'search_v2' => false,\n ],\n];\n\n\nوالآن فئة بسيطة للتحقق من الأعلام:
\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// الاستخدام:\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عيب هذا النهج واضح: لتبديل العلم، تحتاج إلى تغيير ملف الإعدادات وإعادة نشر التطبيق. هذا ليس أفضل من إجراء تغييرات في الكود. نحتاج إلى إدارة ديناميكية.
\n\nأعلام الميزات الديناميكية مع التخزين في قاعدة البيانات
\n\nالنمط الأكثر شيوعًا هو تخزين حالات الأعلام في قاعدة بيانات أو Redis. عندها يمكن تغييرها من خلال لوحة الإدارة دون إعادة تشغيل التطبيق.
\n\nهيكل جدول MySQL
\n\nCREATE 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فئة للعمل مع قاعدة البيانات
\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