PHP مقابل Python للباك إند: أيهما تختار عمليًا في 2024

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

هل تطبيق PHP الخاص بك مثل الفراشة الهشة؟ حان الوقت لاختباره في المعركة

\n\n

تخيل: مساء الجمعة. لقد أطلقت للتو إصدارًا طال انتظاره. كل شيء يعمل بشكل مثالي. تصب لنفسك بعض الشاي، تفتح تيليغرام... ثم يتعطل قاعدة البيانات. أو ريديس. أو واجهة برمجة تطبيقات خارجية. هل يبدو الأمر مألوفًا؟ إذا لم يكن كذلك، فربما لم تواجه فوضى حقيقية من قبل.

\n\n

في عالم تطوير PHP، من الشائع الاعتماد على "الأمل". نكتب كودًا، ونغطيه باختبارات الوحدة، وأحيانًا حتى اختبارات التكامل. ولكن ماذا يحدث عندما لا تسير الأمور وفقًا للخطة؟ عندما يفقد الخادم حزم البيانات، أو تستجيب قاعدة البيانات بتأخير 10 ثوانٍ، أو يمتلئ نظام الملفات؟

\n\n

هنا يأتي دور هندسة الفوضى — وهو تخصص نشأ من عالم Netflix والأنظمة الموزعة الكبيرة. لكن لا تغلق المقالة الآن: إنه يعمل أيضًا مع تطبيقات PHP العادية، حتى لو كان لديك تطبيق متكامل على Laravel أو Symfony.

\n\n

ما هي هندسة الفوضى ولماذا يحتاجها مطور PHP؟

\n\n

هندسة الفوضى هي ممارسة إجراء تجارب على النظام لاكتشاف نقاط الضعف قبل أن تظهر في فشل حقيقي. أنت تقدم أعطالًا عن قصد (تعطيل الخدمات، تأخير الاستجابات، قتل العمليات) وتلاحظ كيف يتصرف تطبيقك.

\n\n

كثيرون يعتقدون: "لدي تطبيق PHP بسيط، لماذا أحتاج إلى هذا؟" لكن لنكن صادقين:

\n\n
    \n
  • هل يعتمد كودك على واجهات برمجة تطبيقات خارجية؟ نعم.
  • \n
  • هل لديك تخزين مؤقت عبر Redis أو Memcached؟ نعم.
  • \n
  • هل تستخدم قوائم الانتظار (RabbitMQ، Kafka، SQS؟) على الأرجح، نعم.
  • \n
  • قاعدة البيانات — MySQL/PostgreSQL؟ نعم.
  • \n
\n\n

كل نقطة من هذه النقاط هي نقطة فشل محتملة. و تحمل PHP للأخطاء يتم اختباره فقط عندما ينكسر شيء ما. تسمح لك هندسة الفوضى بأن تكون الشخص الذي يكسر الأشياء، وليس الشخص الذي يصلحها.

\n\n

المبادئ الأساسية لهندسة الفوضى

\n\n

قبل كتابة الكود، تذكر ثلاث قواعد رئيسية:

\n\n
    \n
  • ابدأ صغيرًا. لا تقم بتعطيل قاعدة البيانات بأكملها مرة واحدة. ابدأ باتصال واحد.
  • \n
  • لديك فرضية. "إذا تعطل Redis، يجب أن يستمر التطبيق في العمل، ولكن بشكل أبطأ" — هذه فرضية. اختبرها.
  • \n
  • أتمتة العودة إلى الحالة الطبيعية. احرص دائمًا على وجود خطة للعودة إلى الحالة الطبيعية.
  • \n
\n\n

الآن دعنا ننتقل إلى أمثلة PHP حقيقية.

\n\n

مثال 1: محاكاة تأخير قاعدة البيانات

\n\n

لنفترض أن لديك استعلامًا نموذجيًا إلى MySQL. أنت تستخدم PDO. كيف تتحقق مما يحدث إذا بدأت قاعدة البيانات فجأة في "التأخير"؟

\n\n

أبسط طريقة هي كتابة وسيط (middleware) أو غلاف (wrapper) لـ PDO يضيف تأخيرًا عشوائيًا. إليك مثال:

\n\n
<?php\nclass ChaoticPDO extends PDO {\n    private float $chaosProbability;\n    private int $maxDelayMs;\n\n    public function __construct(\n        string $dsn, \n        ?string $username = null, \n        ?string $password = null, \n        ?array $options = null,\n        float $chaosProbability = 0.1, // 10% من الطلبات سوف "تتأخر"\n        int $maxDelayMs = 5000        // أقصى تأخير 5 ثوانٍ\n    ) {\n        parent::__construct($dsn, $username, $password, $options);\n        $this->chaosProbability = $chaosProbability;\n        $this->maxDelayMs = $maxDelayMs;\n    }\n\n    public function query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs): PDOStatement|false\n    {\n        $this->maybeInjectDelay();\n        return parent::query($query, $fetchMode, ...$fetchModeArgs);\n    }\n\n    private function maybeInjectDelay(): void {\n        if (mt_rand() / mt_getrandmax() < $this->chaosProbability) {\n            $delay = mt_rand(100, $this->maxDelayMs);\n            usleep($delay * 1000);\n            // تسجيل للمراقبة\n            error_log("[CHAOS] تم إدخال تأخير قدره {$delay} مللي ثانية في استعلام قاعدة البيانات");\n        }\n    }\n}\n\n// الاستخدام\n$pdo = new Ch                

المدونات

توصيات الكتب