معمارية Event-driven في PHP: كتابة كود غير متزامن بسهولة

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

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

ابدأ الدورة

عندما لا يكون كود PHP مجرد سكربت عادي

\n\n

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

\n\n

معمارية Event-driven في PHP ليست مجرد مصطلح عصري من عالم Node.js. بل هي طريقة حقيقية لجعل كودك أسرع وأكثر استجابة وقابلية للتوسع. في هذا المقال، سنشرح كيف تعمل البرمجة الموجهة بالأحداث في PHP، وسنكتب أمثلة عملية، وسنفهم متى نحتاج إليها حقًا.

\n\n

ما هي معمارية Event-driven بلغة بسيطة؟

\n\n

تخيل مكتبًا يعمل فيه كل موظف بدقة وفقًا لتعليمات: "افعل أ، ثم ب، ثم ج". هذا هو الكود التزامني. الآن تخيل مكتبًا يتفاعل فيه الموظفون مع الأحداث: "عندما تصل رسالة بريد إلكتروني - رد عليها"، "عندما يتم تأكيد الطلب - أرسل إشعارًا". هذه هي المعمارية الموجهة بالأحداث.

\n\n

في معمارية Event-driven في PHP، لا يتم تنفيذ البرنامج بشكل خطي. بدلاً من ذلك، ينتظر البرنامج الأحداث (نقرة، طلب، مؤقت، إكمال مهمة) ويتفاعل معها. المكون الرئيسي هنا هو event loop (حلقة الأحداث)، والتي تتحقق باستمرار مما إذا كان هناك حدث قد وقع، وتقوم بتشغيل المعالجات المناسبة.

\n\n

لماذا يجب على مطوري PHP الانتباه إلى هذا؟

\n\n

لفترة طويلة، كان PHP مرتبطًا حصريًا بالتنفيذ التزامني: يأتي طلب -> يعمل السكربت -> يرد بالاستجابة. لكن مع ظهور مكتبات مثل ReactPHP و Amp، تغير كل شيء. الآن يمكنك:

\n\n
    \n
  • معالجة آلاف اتصالات WebSocket في وقت واحد
  • \n
  • تنفيذ المهام الخلفية دون الحاجة إلى قوائم انتظار مثل RabbitMQ
  • \n
  • بناء ميكروسيرفيسات حقيقية باستخدام PHP الخالص
  • \n
  • كتابة عملاء وخوادم HTTP غير متزامنة
  • \n
\n\n

وكل هذا - دون تغيير اللغة أو إعادة كتابة قاعدة الكود بأكملها.

\n\n

المكونات الأساسية لمعمارية Event-driven

\n\n

قبل كتابة الكود، دعنا نفهم المفاهيم الأساسية. في أي نظام موجه بالأحداث في PHP، هناك ثلاثة عناصر رئيسية:

\n\n
    \n
  • Event loop - حلقة لا نهائية تستمع إلى الأحداث (المؤقتات، المقابس، الإشارات) وتوزعها على المعالجات.
  • \n
  • Emitter/Dispatcher - كائن يقوم بتوليد الأحداث وإرسالها.
  • \n
  • Listener/Handler - دالة أو طريقة تستجيب لحدث معين.
  • \n
\n\n

في PHP التقليدي، كنت ستكتب: file_get_contents('https://api.example.com') - وتنتظر الرد. في نهج Event-driven، تشترك في حدث "تم استلام البيانات" وتستمر في تنفيذ كود آخر.

\n\n

مثال 1: موزع أحداث بسيط باستخدام PHP الخالص

\n\n

دعنا ننفذ موزع أحداث أساسي دون استخدام مكتبات خارجية. سيساعدنا هذا في فهم جوهر البرمجة الموجهة بالأحداث في PHP.

\n\n
<?php\n\nclass EventDispatcher {\n    private array $listeners = [];\n\n    public function addListener(string $eventName, callable $listener): void {\n        $this->listeners[$eventName][] = $listener;\n    }\n\n    public function dispatch(string $eventName, mixed $data = null): void {\n        if (!isset($this->listeners[$eventName])) {\n            return;\n        }\n        foreach ($this->listeners[$eventName] as $listener) {\n            call_user_func($listener, $data);\n        }\n    }\n}\n\n// الاستخدام\n$dispatcher = new EventDispatcher();\n\n$dispatcher->addListener('user.registered', function ($userData) {\n    echo "جارٍ إرسال بريد ترحيبي إلى {$userData['email']}\\n";\n});\n\n$dispatcher->addListener('user.registered', function ($userData) {\n    echo "جارٍ تسجيل مستخدم جديد {$userDa                

المدونات

توصيات الكتب