برمجة الشبكات في PHP: من المقابس إلى WebSockets
\n\nعندما نتحدث عن PHP، أول ما يتبادر إلى الذهن هو تطوير الويب: معالجة النماذج، توليد HTML، العمل مع قواعد البيانات. لكن PHP هي أكثر من ذلك بكثير. هل تساءلت يومًا أن نص PHP الخاص بك يمكن أن يصبح ليس مجرد "مستجيب" لطلبات HTTP، بل خادمًا متكاملًا يتواصل مع البرامج الأخرى مباشرة، عبر المقابس (sockets)؟ هذا يفتح الباب أمام عالم من خوادم الدردشة، وصالات الألعاب، وأنظمة المراقبة، وأجهزة إنترنت الأشياء (IoT).
\n\nفي هذه المقالة، سنزيل النظارات الوردية ونشرح برمجة الشبكات في PHP بأمثلة حقيقية. ستتعرف على ماهية المقابس، وكيف تجعل PHP يستمع إلى منفذ، وكيف ترسل وتستقبل البيانات عبر TCP و UDP، وحتى تلمس سحر WebSockets. هيا بنا!
\n\nما هو المقبس (Socket) وما فائدته لـ PHP؟
\n\nالمقبس (socket) هو واجهة برمجية لتبادل البيانات بين العمليات، والتي يمكن تشغيلها على نفس الجهاز أو على أجهزة كمبيوتر مختلفة على الشبكة. تخيل سماعة هاتف: لديك رقم (عنوان IP) ومنفذ (رقم داخلي). ترفع السماعة (تنشئ مقبسًا)، وتطلب الرقم (تتصل)، وتتحدث (تنقل البيانات).
\n\nفي PHP، يتم تنفيذ المقابس من خلال إضافة sockets. عادةً ما تكون معطلة افتراضيًا، لكن تفعيلها سهل. برمجة الشبكات في PHP تسمح بإنشاء:
- \n
- خوادم وعملاء TCP (مثلًا للدردشة أو تبادل البيانات مع خدمة أخرى). \n
- تطبيقات UDP (البث المباشر، المراقبة، حيث فقدان الحزم ليس حرجًا). \n
- خوادم WebSocket (لتطبيقات الوقت الفعلي في المتصفح). \n
الميزة الرئيسية هي أنك تبقى في بيئة PHP المألوفة، دون الانتقال إلى C أو Java أو Node.js. بالطبع، PHP ليس مثاليًا للأنظمة عالية التحميل (بسبب الخيط الواحد)، لكنه مناسب للنماذج الأولية والأدوات الداخلية أو الأحمال المنخفضة.
\n\nإنشاء خادم TCP في PHP
\n\nلنبدأ بالكلاسيكي: خادم TCP يقبل الاتصالات ويرسل تحية. هذا هو أساس أي تطبيق مقبس php.
\n\nالخطوة 1. إنشاء المقبس
\nالدالة socket_create() هي الخطوة الأولى. تأخذ ثلاث معاملات: عائلة البروتوكولات (AF_INET لـ IPv4)، نوع المقبس (SOCK_STREAM لـ TCP)، والبروتوكول (0 - دع النظام يختار).
<?php\n// إنشاء مقبس TCP\n$socket = socket_create(AF_INET, SOCK_STREAM, 0);\nif ($socket === false) {\n echo "خطأ في إنشاء المقبس: " . socket_strerror(socket_last_error()) . "\\n";\n exit;\n}\necho "تم إنشاء المقبس بنجاح.\\n";\n?>\n\nالخطوة 2. الربط بالعنوان والمنفذ
\nنستخدم socket_bind(). نحدد عنوان IP (0.0.0.0 - نستمع لجميع الواجهات) والمنفذ (مثلًا 8080).
<?php\n$address = '0.0.0.0';\n$port = 8080;\n\nif (socket_bind($socket, $address, $port) === false) {\n echo "خطأ في الربط: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\necho "تم ربط المقبس بـ $address:$port\\n";\n?>\n\nالخطوة 3. الاستماع للاتصالات الواردة
\nنحول المقبس إلى وضع الاستماع باستخدام socket_listen(). المعامل الثاني هو الحد الأقصى لطول قائمة انتظار الاتصالات.
<?php\nif (socket_listen($socket, 5) === false) {\n echo "خطأ في الاستماع: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\necho "الخادم قيد التشغيل، في انتظار الاتصالات...\\n";\n?>\n\nالخطوة 4. قبول العميل
\nالدالة المحظورة socket_accept(). تنتظر حتى يتصل شخص ما، وتعيد مقبسًا جديدًا للتواصل مع هذا العميل.
<?php\nwhile (true) {\n $client = socket_accept($socket);\n if ($client === false) {\n echo "خطأ في قبول الاتصال: " . socket_strerror(socket_last_error($socket)) . "\\n";\n break;\n }\n\n echo "اتصل عميل جديد.\\n";\n\n // إر