لماذا كود PHP الخاص بك محكوم عليه بالفشل (وكيف تصلح ذلك)
\n\nتخيل: لقد أطلقت تحديثًا على موقع متجر إلكتروني. كل شيء يعمل بشكل مثالي — في بيئة الاختبار. بعد ساعة من النشر، تتعطل قاعدة البيانات. الموقع يتوقف. الأعمال تخسر مليونًا في الدقيقة. قصة مألوفة؟
\n\nالاختبار التقليدي (الوحدة، التكامل، E2E) يتحقق من السيناريوهات التي تتوقعها. لكن بيئة الإنتاج هي الغرب المتوحش: تأخيرات الشبكة، نقص الذاكرة، أعطال الخدمات، استعلامات بطيئة من المستخدمين الحقيقيين. هنا يأتي دور هندسة الفوضى (Chaos Engineering) — وهو تخصص يساعد في اكتشاف نقاط الضعف في النظام قبل أن تدمر أعمالك.
\n\nفي هذه المقالة على pythonlib.ru، سنشرح كيفية تطبيق هندسة الفوضى لتطبيقات PHP: من البرامج النصية البسيطة إلى التكامل مع الأطر الشهيرة. ستتعلم كيف تكسر الكود عمدًا لتجعله أقوى.
\n\nما هي هندسة الفوضى (وما علاقتها بـ PHP)؟
\n\nهندسة الفوضى (Chaos Engineering) هي ممارسة اختبار النظام تجريبيًا عن طريق إدخال أعطال "فوضوية" محكومة. الهدف هو التحقق من كيفية تفاعل التطبيق مع الظروف غير المتوقعة، والعثور على الأخطاء المخفية التي لا تكتشفها الاختبارات العادية.
\n\nلمطوري PHP، هذا مهم بشكل خاص. غالبًا ما يعمل PHP مع MySQL/PostgreSQL وRedis وNginx ومجموعة من الخدمات المصغرة. كل حلقة في هذه السلسلة قد تتعطل. تساعد هندسة الفوضى في الإجابة على الأسئلة التالية:
\n\n- \n
- ماذا يحدث إذا توقف Redis عن الاستجابة لمدة 5 ثوانٍ؟ \n
- كيف سيتصرف التطبيق عند فصل قاعدة البيانات فجأة؟ \n
- هل يتحمل الكود تدفق 1000 طلب متزامن؟ \n
- ماذا يحدث إذا تلف ملف الإعدادات؟ \n
أدوات هندسة الفوضى في PHP
\n\nلحسن الحظ، لست بحاجة لكتابة كل شيء من الصفر. إليك الأدوات الرئيسية التي ستساعدك في إدخال الفوضى إلى تطبيق PHP الخاص بك:
\n\n1. Chaos Monkey لـ PHP (مخصص)
\nقامت Netflix بنشر Chaos Monkey — وهي خدمة تقتل العمليات بشكل عشوائي. في PHP، يمكنك تنفيذ منطقها باستخدام برنامج نصي بسيط يقوم بتعطيل الخدمات في بيئة الاختبار.
\n\n2. مكتبات حقن الأخطاء (Fault Injection)
\nالمكتبات المتخصصة، مثل lstrojny/fault-injection أو phpstan/phpstan (للتحليل الثابت)، تساعد في محاكاة الأخطاء على مستوى الكود.
3. اختبار الأداء + الفوضى
\nالجمع بين أدوات مثل Apache Bench أو JMeter أو k6 مع تجارب الفوضى يعطي أقصى تأثير.
\n\n4. Docker و Kubernetes
\nإذا كنت تستخدم الحاويات، يمكنك بسهولة "قتل" حاويات PHP-FPM أو Nginx، ومراقبة سلوك النظام.
\n\nمثال عملي: تعطيل قاعدة البيانات في تطبيق PHP
\n\nلنكتب كودًا يحاكي فشل قاعدة البيانات ويتحقق من كيفية معالجة تطبيقنا لهذا الموقف. هذه تجربة كلاسيكية في هندسة الفوضى.
\n\nالخطوة 1: الكود المراد اختباره
\n\nلنفترض أن لدينا فئة بسيطة للتعامل مع المستخدمين:
\n\n<?php\n\nclass UserRepository {\n private PDO $pdo;\n \n public function __construct(PDO $pdo) {\n $this->pdo = $pdo;\n }\n \n public function findById(int $id): ?array {\n try {\n $stmt = $this->pdo->prepare('SELECT * FROM users WHERE id = ?');\n $stmt->execute([$id]);\n $user = $stmt->fetch(PDO::FETCH_ASSOC);\n return $user ?: null;\n } catch (PDOException $e) {\n // تسجيل الخطأ\n error_log('Database error: ' . $e->getMessage());\n return null;\n }\n }\n}\n\nالكود يبدو موثوقًا: إذا تعطلت قاعدة البيانات، نلتقط الاستثناء ونعيد null. لكن دعنا نكمل...