ما وراء التحديث المباشر للبيانات؟ تعرف على تقنيات الوقت الفعلي
\n\nهل تساءلت يومًا كيف تعمل الدردشة التي تصل فيها الرسائل فورًا، أو شاشة أسعار الأسهم التي تتجدد تلقائيًا؟ طلب HTTP التقليدي (حيث يطلب المتصفح من الخادم ويستجيب الخادم) غير مناسب هنا - فهو بطيء وغير فعال. نحتاج إلى سحر الوقت الفعلي.
\n\nعلى Stack Overflow، حصد سؤال "ما هي Long-Polling، Websockets، Server-Sent Events (SSE) و Comet؟" آلاف المشاهدات. هذا يعني أن الخلط بين هذه المصطلحات أمر طبيعي. اليوم سنقوم بترتيب الأمور، ونكتب كودًا حقيقيًا بلغة PHP، ونفهم متى نستخدم كل تقنية.
\n\nلن نستخدم أطر عمل معقدة - فقط PHP خالص وبعض المكتبات الشائعة. هيا بنا!
\n\n1. HTTP Polling (الاستقصاء العادي) - جد التقنيات
\n\nقبل الحديث عن الأمور المتقدمة، دعنا نتذكر الاستقصاء الأساسي. يرسل العميل (JavaScript) طلبًا إلى الخادم كل N ثانية. يجيب الخادم: "لا توجد بيانات جديدة" أو "هذه هي البيانات".
\n\nكود PHP (جانب الخادم):
\n<?php\n// polling_server.php\nheader('Content-Type: application/json');\n\n// محاكاة الحصول على البيانات\n$data = ['message' => 'مرحبًا في ' . date('H:i:s')];\necho json_encode($data);\n\n\nجانب العميل (JavaScript):
\nsetInterval(() => {\n fetch('polling_server.php')\n .then(response => response.json())\n .then(data => console.log(data.message));\n}, 3000); // كل 3 ثوانٍ\n\nالإيجابيات: البساطة. السلبيات: طلبات زائدة كثيرة، ضغط على الخادم، تأخير يصل إلى N ثانية. بالنسبة للدردشة، هذا كارثة.
\n\n2. Long-Polling - حل ذكي بديل
\n\nLong-Polling هو نسخة محسّنة من الاستقصاء. يفتح العميل طلب HTTP، ولا يستجيب الخادم فورًا إذا لم تكن هناك بيانات. يبقي الاتصال مفتوحًا (في انتظار). بمجرد ظهور البيانات، يرسل الخادم الرد ويغلق الاتصال. يفتح العميل طلبًا جديدًا فورًا.
\n\nمن وجهة نظر العميل، هو مجرد fetch عادي. من وجهة نظر الخادم، يجب أن يكون قادرًا على "النوم" والاستيقاظ.
\n\nمثال Long-Polling بلغة PHP
\n<?php\n// long_polling.php\nheader('Content-Type: application/json');\nheader('Cache-Control: no-cache');\n\n// محاكاة انتظار رسائل جديدة (مثلاً من ملف أو قاعدة بيانات)\n$lastCheck = time();\n$timeout = 30; // أقصى انتظار 30 ثانية\n\nwhile (time() - $lastCheck < $timeout) {\n // التحقق من وجود بيانات جديدة\n $newData = checkForNewMessages(); // الدالة الخاصة بك\n if ($newData !== null) {\n echo json_encode(['status' => 'ok', 'data' => $newData]);\n exit;\n }\n // النوم لمدة ثانية واحدة لتخفيف الضغط على المعالج\n sleep(1);\n}\n\n// إذا لم تظهر بيانات خلال 30 ثانية - نرد برد فارغ\necho json_encode(['status' => 'timeout', 'data' => null]);\n\n\nهام: في مشروع حقيقي، استبدل sleep(1) بـ usleep(500000) (0.5 ثانية) واستخدم فحوصات غير مانعة (مثل filemtime() للملف أو SELECT ... FOR UPDATE مع مهلة في قاعدة البيانات).
أين يُستخدم: الدردشات القديمة، الإشعارات في المواقع التي لا تدعم WebSockets. السلبيات: لا يزال هناك العديد من الاتصالات، ويستهلك الخادم موارد على الطلبات "المعلقة".
\n\n3. Server-Sent Events (SSE) - قناة أحادية الاتجاه من الخادم
\n\nSSE (Server-Sent Events) هي تقنية مدمجة في HTML5. يمكن للخادم إرسال البيانات إلى العميل في أي لحظة، ولكن في اتجاه واحد فقط (خادم ← عميل). العميل هو EventSource عادي في JavaScript.
\n\nSSE مثالية لـ: شريط الأخبار، أسعار الأسهم، السجلات، الإشعارات.
\n\nكود PHP (الخادم):
\n<?php\n// sse_server.php\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache'