هل ما زلت تقوم بتحديث الصفحة يدويًا؟ حان الوقت للانتقال إلى الوقت الفعلي
\n\nتخيل: لقد فتحت بورصة عملات عبر الإنترنت، وسعر الدولار متجمد تمامًا. تضغط على F5، وتضغط مرة أخرى - لكنه لا يتغير. هل هذا مألوف؟ والآن تخيل أن السعر يتم تحديثه تلقائيًا، كما في الأفلام - بسلاسة وبدون تأخير. هذا ليس سحرًا، إنها تقنيات الوقت الفعلي. هي التي تحول الموقع الثابت إلى كائن حي: الدردشات، الإشعارات، لوحات المعلومات المحدثة في الوقت الفعلي.
\n\nاليوم سنقوم بتحليل الأركان الأربعة التي يقوم عليها الويب في الوقت الفعلي: Long-Polling، WebSockets، Server-Sent Events (SSE) و Comet. سأريكم كيف تعمل "تحت الغطاء"، وسأقدم لكم كودًا جاهزًا بلغة PHP يمكنكم استخدامه الآن. هيا بنا!
\n\nالمقالة مكتوبة للبوابة التعليمية pythonlib.ru - هنا نحول المفاهيم المعقدة إلى أدوات مفهومة.
\n\nباختصار عن الشيء الرئيسي: ما وراء المصطلحات؟
\n\nعندما تفتح صفحة عادية، يقوم المتصفح بإجراء طلب، ويستجيب الخادم - يتم إغلاق الاتصال. الأمر بسيط. ولكن ماذا لو أراد الخادم نفسه أن "يطرق بابك" ببيانات جديدة؟ هنا تبدأ الرقصات مع الدف.
\n\n- \n
- Long-Polling (الاستقصاء الطويل) - الجد القديم ولكن الموثوق. العميل "يعلق" على الخادم وينتظر حتى يتفضل بالرد. \n
- WebSockets (ويب سوكيت) - صيحة السنوات الأخيرة. قناة ثنائية الاتجاه كاملة، مثل خط الهاتف. \n
- Server-Sent Events (SSE) - بث أحادي الاتجاه من الخادم إلى العميل. مثالي لخلاصات الأخبار وأسعار الصرف. \n
- Comet - اسم عام للتقنيات التي يدفع فيها الخادم البيانات إلى العميل دون طلب إضافي. Long-Polling و SSE هما حالتان خاصتان من Comet. \n
التقنية رقم 1: Long-Polling - جد الوقت الفعلي
\n\nLong-Polling هو عندما يقول العميل للخادم: "سأنتظر طالما كان ذلك ضروريًا، فقط أجب عندما تظهر البيانات". يفتح العميل اتصالًا ويبقيه مفتوحًا حتى يرسل الخادم ردًا. بعد استلام الرد، يقوم العميل فورًا بإنشاء طلب جديد. والنتيجة هي سلسلة لا نهائية.
\n\nالإيجابيات: يعمل على أي استضافة، ولا يتطلب مكتبات إضافية، ومدعوم من جميع المتصفحات.
\nالسلبيات: الكثير من الرؤوس غير الضرورية، وضغط على الخادم، وتأخير عند وجود عدد كبير من العملاء.
\n\nمثال بلغة PHP (Long-Polling)
\n\n<?php\n// long_polling.php\nheader('Content-Type: text/plain; charset=utf-8');\nheader('Cache-Control: no-cache');\n\n$timeout = 30; // ننتظر 30 ثانية كحد أقصى\n$start = time();\n\n// محاكاة ظهور بيانات جديدة\n$data = getNewDataFromDB(); // دالتك لجلب البيانات\n\nwhile (empty($data)) {\n if ((time() - $start) > $timeout) {\n echo json_encode(['status' => 'timeout', 'data' => null]);\n flush();\n exit;\n }\n usleep(500000); // ننام لمدة 0.5 ثانية\n $data = getNewDataFromDB();\n}\n\necho json_encode(['status' => 'ok', 'data' => $data]);\nflush();\n?>\n\nعلى جانب العميل (JavaScript) سيبدو الأمر هكذا:
\n\nfunction longPoll() {\n fetch('/long_polling.php')\n .then(response => response.json())\n .then(data => {\n if (data.status === 'ok') {\n console.log('بيانات جديدة:', data.data);\n // تحديث الواجهة\n }\n longPoll(); // إنشاء طلب جديد فورًا\n })\n .catch(error => {\n console.error('خطأ:', error);\n setTimeout(longPoll, 1000); // إعادة الاتصال بعد ثانية\n });\n}\nlongPoll();\n\nهل ترى؟ العميل يعلق، ينتظر، يستلم البيانات - ثم يعلق مرة أخرى. هذا هو Long-Polling بلغة PHP في أنقى صوره.
\n\nالتقنية رقم 2: WebSockets - الطريق السريع ثنائي الاتجاه
\n\nWebSockets