مقدمة: لماذا برمجة الشبكات بلغة PHP ليست صعبة بل ممتعة
\n\nعندما تسمع "برمجة الشبكات"، قد يتبادر إلى ذهنك صور مطوري C++ المحترفين وهم يتعاملون مع المقابس منخفضة المستوى، أو مسؤولي الأنظمة الذين يكتبون نصوصًا بلغة Python لمراقبة الشبكة. وماذا عن PHP؟ أليس دورها فقط عرض "Hello, World!" على المواقع؟
\n\nفي الحقيقة، PHP هي أداة قوية للتفاعل مع الشبكات. فهي قادرة على فتح المقابس، إرسال طلبات HTTP، العمل مع WebSocket، وحتى استخراج البيانات من المواقع الأخرى. وكل هذا دون الحاجة إلى تثبيت إضافات إضافية (تقريبًا).
\n\nفي هذه المقالة، سنستعرض التقنيات الأساسية لبرمجة الشبكات بلغة PHP. ستتعلم كيفية كتابة عميل TCP بسيط، وكيفية أتمتة طلبات API، وكيفية استخراج البيانات من المواقع، وكيفية إنشاء غرفة دردشة خاصة بك باستخدام WebSocket. هيا بنا!
\n\n1. أساسيات المقابس (Sockets) في PHP
\n\nالمقابس هي طريقة منخفضة المستوى للتواصل بين البرامج عبر الشبكة. في PHP، يتم التعامل مع المقابس من خلال دوال عائلة socket_*. هذه الدوال موجودة في التثبيت القياسي، لكنها قد تتطلب تفعيل إضافة sockets في ملف php.ini.
إنشاء عميل TCP
\n\nلنكتب عميلًا بسيطًا يتصل بخادم (مثل time.nist.gov - خادم الوقت الدقيق) ويقرأ الرد:
\n\n<?php\n$host = 'time.nist.gov';\n$port = 37;\n\n// إنشاء مأخذ\n$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);\nif ($socket === false) {\n echo "فشل إنشاء المأخذ: " . socket_strerror(socket_last_error()) . "\\n";\n exit;\n}\n\n// الاتصال\n$result = socket_connect($socket, $host, $port);\nif ($result === false) {\n echo "فشل الاتصال: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\n\n// قراءة 4 بايت (الوقت بصيغة NTP)\n$bytes = socket_read($socket, 4);\nif ($bytes === false) {\n echo "خطأ في القراءة: " . socket_strerror(socket_last_error($socket)) . "\\n";\n exit;\n}\n\n// إغلاق المأخذ\nsocket_close($socket);\n\n// تحويل البيانات الثنائية إلى رقم\n$time = unpack('N', $bytes)[1];\n// وقت NTP يبدأ من عام 1900، نطرح 70 سنة (بالثواني)\n$unix_time = $time - 2208988800;\necho "الوقت الحالي (UNIX): " . date('Y-m-d H:i:s', $unix_time) . "\\n";\n?>\n\nهذا الكود يتصل بخادم الوقت الدقيق، ويقرأ 4 بايت (الوقت بصيغة NTP)، ويحولها إلى تاريخ مفهوم. لاحظ معالجة الأخطاء - فهي ضرورية في برمجة الشبكات.
\n\nإنشاء خادم TCP بسيط
\n\nوالآن لنكتب خادمًا صغيرًا خاص بنا، يستقبل الاتصالات ويرد بـ "Hello, client!":
\n\n<?php\n$host = '127.0.0.1';\n$port = 8080;\n\n$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);\nsocket_bind($server, $host, $port);\nsocket_listen($server, 5);\n\necho "الخادم يعمل على $host:$port\\n";\n\nwhile (true) {\n $client = socket_accept($server);\n if ($client === false) {\n continue;\n }\n $msg = "Hello, client!\\n";\n socket_write($client, $msg, strlen($msg));\n socket_close($client);\n}\nsocket_close($server);\n?>\n\nقم بتشغيل النص البرمجي في الطرفية (php server.php)، ثم اتصل به عبر telnet: telnet 127.0.0.1 8080. ستظهر لك رسالة الترحيب.
نصيحة: للمشاريع الحقيقية، استخدم مكتبات جاهزة مثل ReactPHP أو Amp - فهي توفر معالجة غير متزامنة وواجهة برمجة سهلة.
2. طلبات HTTP باستخدام cURL
\n\ncURL هو أداة متعددة الاستخدامات للتعامل مع HTTP في PHP. يمكنه إجراء طلبات GET و POST، والتعامل مع الكوكيز، والروؤس، والبروكسي، والشهادات. إضافة curl عادة ما تكون مثبتة مسبقًا.
طلب GET أساسي
\n\n<?php\n$ch = curl_init('https://api.github.com/repos/php/php-src');\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_USERAGENT, 'PHP Script');\n$response = curl_exec($ch);\n$http_code = curl_getinf