Long-Polling، WebSockets، SSE و Comet: تحليل كامل مع كود بلغة PHP

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

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

ابدأ الدورة

هل ما زلت تقوم بتحديث الصفحة يدويًا؟ حان الوقت للانتقال إلى الوقت الفعلي

\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
\n\n

التقنية رقم 1: Long-Polling - جد الوقت الفعلي

\n\n

Long-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\n
function 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\n

WebSockets

المدونات

توصيات الكتب