ما هي الاستطلاعات الطويلة ، Websockets ، أحداث إرسال Server (SSE) و Comet؟

لقد حاولت قراءة بعض المقالات ، لكنني لست واضحا في المفاهيم حتى الآن.

هل يرغب أحد الأشخاص في التقاط صورة توضح لي ما هي هذه التقنيات:

  1. الاقتراع الطويل
  2. أحداث الخادم التي تم إرسالها
  3. ومآخذ الويب </لى>
  4. والمذنب </لى>

شيء واحد صادفته في كل مرة كان ، الخادم يحتفظ بالاتصال مفتوحًا ويدفع البيانات إلى العميل. كيف تم فتح الاتصال ، وكيف يحصل العميل على البيانات المدفوعة؟ (كيف يستخدم العميل البيانات ، وربما يساعد بعض التعليمات البرمجية؟)

والآن ، أي واحد منهم يجب أن أستخدمه لتطبيق في الوقت الفعلي. لقد سمعت الكثير عن websockets (مع socket.io [مكتبة node.js]) ولكن لماذا لا PHP؟

862
بالإضافة إلى ذلك: تعتبر أحداث Comet و ServerSent هي حل PHP لتحقيق ما يقرب من الوقت الفعلي (وليس في الواقع) دون إنشاء خوادم 2.
وأضاف المؤلف PauAI, مصدر
websocket في الوقت الحقيقي أو webrtc؟ هناك مكتبة ل websocket في PHP ، تحتاج إلى كتابة رمز إضافي من أجل العمل باستخدام ZMQ أو مجرد برمجة مقبس ، تم تصميم nodeJs لهذا متاح بسهولة. السبب في عدم توفر websocket بسهولة في PHP هو أنه يجب عليك تشغيل محطة إضافية وتشغيلها بحيث يكون خادم websocket متاحًا بسهولة ، سيكون لديك خطين أساسيين للخوادم. والهيكل ، PHP ليس بنية حدث مثل JavaScript ولذلك ، فإن websocket يستخدم بنية الحدث من أجل التقاط الرسائل وإرسالها.
وأضاف المؤلف PauAI, مصدر

3 إجابة

في الأمثلة أدناه ، يكون العميل هو المستعرض ويكون الخادم هو خادم الويب الذي يستضيف موقع الويب.

قبل أن تتمكن من فهم هذه التقنيات ، يجب عليك أولاً فهم حركة مرور HTTP الكلاسيكية HTTP.

HTTP العادي:

  1. يطلب العميل صفحة ويب من خادم.
  2. يحسب الخادم الاستجابة
  3. يرسل الخادم الاستجابة إلى العميل. </لى>

HTTP

الاقتراع اجاكس:

  1. يطلب العميل صفحة ويب من خادم يستخدم HTTP العادي (راجع HTTP أعلاه).
  2. يتلقى العميل صفحة الويب المطلوبة وينفذ جافا سكريبت في الصفحة التي تطلب ملفًا من الخادم على فترات زمنية منتظمة (على سبيل المثال 0.5 ثانية).
  3. يحسب الخادم كل استجابة ويرسلها مرة أخرى ، تمامًا مثل حركة مرور HTTP العادية.

Ajax Polling

اياكس Long-Polling:

  1. يطلب العميل صفحة ويب من خادم يستخدم HTTP العادي (راجع HTTP أعلاه).
  2. يتلقى العميل صفحة الويب المطلوبة وينفذ جافا سكريبت في الصفحة التي تطلب ملفًا من الخادم.
  3. لا يستجيب الخادم على الفور للمعلومات المطلوبة ولكنه ينتظر حتى تتوفر معلومات جديدة .
  4. عندما تكون هناك معلومات جديدة متاحة ، يستجيب الخادم بالمعلومات الجديدة.
  5. يتلقى العميل المعلومات الجديدة ويرسل طلبًا آخر إلى الخادم على الفور ، ويعيد بدء العملية. </لى>

Ajax Long-Polling

HTML5 Server Sent Events (SSE)/EventSource:

  1. A client requests a webpage from a server using regular HTTP (see HTTP above).
  2. The client receives the requested webpage and executes the JavaScript on the page which opens a connection to the server.
  3. The server sends an event to the client when there's new information available.

    • Real-time traffic from server to client, mostly that's what you'll need
    • You'll want to use a server that has an event loop
    • Not possible to connect with a server from another domain
    • If you want to read more, I found these very useful: (article), (article), (article), (tutorial).

HTML5 SSE

HTML5 Websockets:

  1. A client requests a webpage from a server using regular http (see HTTP above).
  2. The client receives the requested webpage and executes the JavaScript on the page which opens a connection with the server.
  3. The server and the client can now send each other messages when new data (on either side) is available.

    • Real-time traffic from the server to the client and from the client to the server
    • You'll want to use a server that has an event loop
    • With WebSockets it is possible to connect with a server from another domain.
    • It is also possible to use a third party hosted websocket server, for example Pusher or others. This way you'll only have to implement the client side, which is very easy!
    • If you want to read more, I found these very useful: (article), (article) (tutorial).

HTML5 WebSockets

المذنب:

المذنب عبارة عن مجموعة من التقنيات قبل HTML5 التي تستخدم الدفق والإقتراع الطويل لتحقيق تطبيقات في الوقت الحقيقي. اقرأ المزيد على wikipedia أو هذه المقالة .


الآن ، أي واحد منهم يجب أن أستخدمه لتطبيق فوري (الذي أحتاج إليه   الشفرة). لقد سمعت الكثير عن websockets (مع socket.io [أ   node.js library]) لكن لم لا PHP؟

يمكنك استخدام PHP مع WebSockets ، راجع Ratchet .

1840
وأضاف
ما هو الفرق الحقيقي بين SSE و Websockets؟
وأضاف المؤلف Basj, مصدر
لماذا تقول لا تستخدم اباتشي؟
وأضاف المؤلف bobzer, مصدر
لم أتمكن من فهم الاختلافات بين المذنب و الاستطلاع الطويل . في كلا التقنيتين ، نقوم (كعميل) بإرسال طلب ajax والانتظار مع طلب HTTP مفتوح للحصول على إجابة من الخادم. Tieme
وأضاف المؤلف Eray, مصدر
س: في PHP ، لنفترض أنك كنت تستخدم websocket إذا كان كل عميل متصلاً بالخادم الخاص بي باستخدام ws: سيكون له خيط واحد مخصص له/لها وحجمه سيكون ~ 2mb كما هو الحال مع الطلبات العادية؟ كيف يختلف ذلك في العقيدات؟ ما عدد العملاء المتزامنين الذين يمكنهم التعامل مع nodejs ومتى يخترق ما يحدث؟
وأضاف المؤلف Muhammad Umer, مصدر
Tieme أوه كان ذلك؟ اعتقدت SSE يعني أحداث الإرسال Server. على أي حال ، شكرا ، أراه الآن.
وأضاف المؤلف index, مصدر
هذا رائع! أقرأ في SSE ووجدت هذه المقالة ، إنها لطيفة جدًا - مثلما قارنت الآن الأشياء ، هل يمكنك أيضًا تضمين SSE هنا حتى نتمكن أيضًا من التحقق من اختلافها مع Websocket؟
وأضاف المؤلف index, مصدر
Tieme ما هي أفضل طريقة لاسترداد البيانات كعميل لمستخدمي Android من خادم مقابس الويب؟
وأضاف المؤلف Apple Appala, مصدر
سيكون من الرائع لو كانت هذه الإجابة أكثر وضوحًا حول التقنية الأساسية. ما هي اتصالات TCP التي يتم استخدامها؟ هل تم تأسيس الاتصالات الثانية على الوصلة الأولى المستخدمة في تقديم الطلب الأصلي؟ كيف يتم تضمين خط أنابيب HTTP؟
وأضاف المؤلف Charlie, مصدر
يمكنك تحقيق نفس الشيء مع كلا المحلين ولكن الآلية مختلفة. يستخدم الاستقصاء الطويل بيانات http "العادية" ، تستخدم SSE بروتوكولًا أساسيًا مختلفًا وتحتاج إلى إعداد خادم مختلف مقارنةً بالاستقصاء الطويل.
وأضاف المؤلف Tieme, مصدر
Eray ، هل قرأت الفقرة الأخيرة واتبعت رابط لمزيد من المعلومات حول المذنب؟
وأضاف المؤلف Tieme, مصدر
حسنا يمكنك استخدام اباتشي إذا كنت تريد. لكن الكثير من الأشخاص يستخدمون Node.js لأنه يحتوي على حلقة حدث. ولكن بالنسبة إلى Apache ، راجع PHP الأصلي لمآخذ الويب المتاحة٪ 2312204603 "> stackoverflow.com/questions/12203443/&hellip،
وأضاف المؤلف Tieme, مصدر
أوافق ، هل لديك هذه المعرفة أم أنك تعرف مستخدمًا يفعل ذلك؟
وأضاف المؤلف Tieme, مصدر
أعتقد أنه يجب أن يكون: "العميل ينفذ جافا سكريبت على الصفحة" حتى هذا هو المتصفح ، وليس القطع. واضح؟
وأضاف المؤلف Tieme, مصدر
كنت مسمر ذلك ... إجابة رهيبة
وأضاف المؤلف kunal, مصدر
هل يمكن أن تقترح لي أي بروتوكول Comet سيتم استخدامه لـ Spring MVC.
وأضاف المؤلف Yasir Shabbir Choudhary, مصدر
Tieme ما الفرق بين SSE والسحب الطويل؟ من كلماتك ، هم تقريبا نفس الشيء.
وأضاف المؤلف tomwang1013, مصدر
فقط للإضافة إلى ما قام بهTieme بالفعل ، يمكن التعامل مع قيود كل من SSE و WS على النحو التالي: يمكن حل مشكلة إعادة الاتصال WS باستخدام مكتبة عميل مناسبة ، على سبيل المثال awesome-websocket . يمكن حل مشكلة خادم SSE عبر أصل بواسطة إرسال رؤوس CORS في الرد
وأضاف المؤلف Piyush Kansal, مصدر
أعتقد أن Long Polling (وربما المذنب أيضًا) سيكون مقيدًا بالبنية الأساسية للشبكة التي تفرض مهلة قصيرة على HTTP.
وأضاف المؤلف Ced, مصدر
لقد فُقدت مع شرحك في النقطة التي كنت تشرح فيها استطلاع أجاكس وقلت "يطلب العميل صفحة ويب من خادم يستخدم HTTP العادي (انظر HTTP أعلاه) ثم صفحة الويب المطلوبة تنفيذ جافا سكريبت ... "كيف يمكن لخادم الويب العادي (مثل apache)" تنفيذ JavaScript
وأضاف المؤلف Olowookere Emmanuel, مصدر

لقد بذلت Tieme الكثير من الجهد في إجابته الممتازة ، ولكن أعتقد أن جوهر سؤال العمليات هو كيفية ارتباط هذه التقنيات بـ PHP بدلاً من كيفية عمل كل تقنية.

PHP هي اللغة الأكثر استخدامًا في تطوير الويب إلى جانب جانب العميل الواضح html و CSS و javascript. ومع ذلك ، فإن PHP لديها قضيتان رئيسيتان عندما يتعلق الأمر بالتطبيقات في الوقت الفعلي:

1) بدأت PHP باعتبارها CGI الأساسية للغاية. لقد تقدمت PHP إلى حد بعيد منذ أن كانت في مرحلة مبكرة ، ولكنها حدثت بخطوات صغيرة. كان لدى PHP العديد من الملايين من المستخدمين في الوقت الذي أصبحت فيه مكتبة C المضمنة والمرنة التي أصبحت اليوم ، ومعظمهم يعتمدون على نموذج التنفيذ السابق ، لذلك لم يقم بعد بمحاولة صلبة للهروب من نموذج cgi داخليًا. حتى واجهة سطر الأوامر تستدعي مكتبة PHP (libphp5.so على linux ، php5ts.dll على نظام التشغيل windows ، إلخ) كما لو أنها لا تزال معالجة طلب GET/POST. ما زال ينفذ الكود كما لو أنه يجب عليه بناء "صفحة" ثم إنهاء دورة حياته. ونتيجة لذلك ، لا يتوفر سوى دعم ضئيل للغاية للبرامج متعددة الخيوط أو التي تستند إلى الأحداث (داخل مساحة PHP) ، مما يجعلها غير عملية حاليًا لتطبيقات متعددة المستخدمين في الوقت الفعلي.

لاحظ أن PHP لديها امتدادات لتوفير حلقات الأحداث (مثل libevent) و مؤشرات الترابط (مثل pthreads) في مساحة PHP ، ولكن القليل جدا جدا من التطبيقات يستخدم هذه.

2) لا تزال PHP تواجه مشاكل كبيرة في جمع القمامة. على الرغم من أن هذه المشكلات قد تم تحسينها باستمرار (من المرجح أنها خطوة كبرى لإنهاء دورة الحياة كما هو موضح أعلاه) ، إلا أن أفضل المحاولات لإنشاء تطبيقات PHP طويلة الأمد تتطلب إعادة تشغيلها بشكل منتظم. هذا أيضًا يجعله غير عملي للتطبيقات في الوقت الفعلي.

ستكون PHP 7 خطوة رائعة لإصلاح هذه المشكلات أيضًا ، ويبدو أنها واعدة جدًا كمنصة للتطبيقات في الوقت الفعلي.

31
وأضاف
يبدو PHP 7 واعدة جدا كمنصة للتطبيقات في الوقت الحقيقي؟ ما هو التحسين/التغيير في PHP7 لتطبيقات الوقت الحقيقي؟
وأضاف المؤلف I'll-Be-Back, مصدر
تصحيح صغير واحد: تمت كتابة PHP دائمًا في C ، كما يمكن رؤيته هنا: museum.php.net/php1 أيضا ، "أقل استخداما (ولكن أكثر شعبية بشكل كبير)" هو بالأحرى متناقض ؛ ربما ما تعنيه هو "أكثر من المألوف"؟
وأضاف المؤلف IMSoP, مصدر
على الرغم من ذلك أيضًا svn.php. net/viewvc/phpdoc/ar/trunk/appendices/& hellip؛ && PHP "rel =" nofollow noreferrer "> web.archive.org/web/20090426061624/http://us3.php.net/&hellip؛
وأضاف المؤلف eis, مصدر
وأضاف المؤلف eis, مصدر
@ سأكون بين العودة - إدارة الذاكرة الثابتة/جمع القمامة ، تجميع JIT ، الخ
وأضاف المؤلف JSON, مصدر
سأزيل بعض الشيء عن بيرل لأنه لا يمتزج جيداً مع الوثائق الرسمية ، لكن هذا لا يزال مجالاً مربكاً في التطور المبكر لـ PHP.
وأضاف المؤلف JSON, مصدر
IMSoP - شكرا على التصحيح ، لقد كنت تستخدم PHP لأكثر من عشر سنوات ، وكان دائما في ظل انطباع أن الجذور كانت في بيرل. تدعم صفحة PHP history بوضوح أنها كانت C في الأصل. سأقوم بتحرير إجابتي بمجرد أن أجد لحظة.
وأضاف المؤلف JSON, مصدر
يرجى تعديل إجابتك فيما يتعلق بجذور php.
وأضاف المؤلف Netverse, مصدر

لقد حاولت تدوين الملاحظات حول هذه الأشياء وجمعنا أمثلة مكتوبة من منظور جافا .

HTTP لمطوري جافا

Reverse Ajax - Old style

Async Handling on server side

Reverse Ajax - New style

Server Sent Events

وضعه هنا لأي مطور java يبحث في نفس الموضوع.

7
وأضاف
جميع الروابط ميتة الآن
وأضاف المؤلف SpringLearner, مصدر
SpringLearner نشكرك على ملاحظة ذلك. لقد قمت بتحديث الروابط
وأضاف المؤلف John, مصدر