Що таке довгі опитування, веб-розетки, події, надіслані сервером (SSE) та комета?


1046

Я спробував прочитати деякі статті, але я ще не дуже зрозумілий щодо понять.

Хтось хотів би знятись, пояснивши мені, що це за технології:

  1. Довгі опитування
  2. Події, надіслані сервером
  3. Веб-розетки
  4. Комета

Одне, на що я стикався кожного разу, це те, що сервер підтримує зв’язок відкритим і передає дані клієнту. Як з'єднання підтримується відкритим і як клієнт отримує дані, що надсилаються? (Як клієнт використовує дані, можливо, якийсь код може допомогти?)

Тепер, який із них я повинен використовувати для додатка в реальному часі. Я багато чув про веб-розетки (з socket.io [бібліотека node.js]), але чому б не PHP?


1
Websocket в реальному часі чи webrtc? У php є бібліотека веб-сокетів, вам потрібно написати додатковий код для того, щоб він працював за допомогою програмування ZMQ або просто socket, для цього побудовано nodeJs, так що його легко можна отримати. Причина, що веб-сокет недоступний у php, полягає в тому, що вам потрібно запустити додатковий термінал і продовжувати його працювати, щоб сервер веб-сокетів був легко доступний, у вас буде нижня лінія двох серверів. а структура, php - це не подія, як JavaScript, тому веб-розетка використовує структуру подій для лову та відправки повідомлень.
PauAI

Додатково: події Comet та ServerSent є вирішенням PHP для досягнення майже реального часу (не дуже) без створення двох серверів.
PauAI

Відповіді:


2075

У наведених нижче прикладах клієнт - це браузер, а сервер - веб-сервер, що розміщує веб-сайт.

Перш ніж ви зможете зрозуміти ці технології, ви повинні спочатку зрозуміти класичний веб-трафік HTTP.

Звичайний HTTP:

  1. Клієнт запитує веб-сторінку від сервера.
  2. Сервер обчислює відповідь
  3. Сервер надсилає відповідь клієнту.

HTTP

Опитування в Аяксі:

  1. Клієнт запитує веб-сторінку з сервера, використовуючи звичайний HTTP (див. HTTP вище).
  2. Клієнт отримує запитувану веб-сторінку і виконує JavaScript на сторінці, яка запитує файл із сервера через рівні інтервали (наприклад, 0,5 секунди).
  3. Сервер обчислює кожну відповідь і повертає її назад, як і звичайний HTTP-трафік.

Опитування в Аяксі

Аякс довготерміновий:

  1. Клієнт запитує веб-сторінку з сервера, використовуючи звичайний HTTP (див. HTTP вище).
  2. Клієнт отримує запитувану веб-сторінку та виконує JavaScript на сторінці, яка запитує файл із сервера.
  3. Сервер не одразу відповідає на запитувану інформацію, але чекає, поки з’явиться нова інформація.
  4. Коли є нова інформація, сервер відповідає на нову інформацію.
  5. Клієнт отримує нову інформацію та негайно відправляє інший запит на сервер, повторно запускаючи процес.

Аякс довготерміновий

Події, надіслані сервером HTML5 (SSE) / EventSource:

  1. Клієнт запитує веб-сторінку з сервера, використовуючи звичайний HTTP (див. HTTP вище).
  2. Клієнт отримує запитувану веб-сторінку і виконує JavaScript на сторінці, яка відкриває з'єднання з сервером.
  3. Сервер надсилає клієнту подію, коли доступна нова інформація.

HTML5 SSE

Веб-розетки HTML5:

  1. Клієнт запитує веб-сторінку від сервера, використовуючи звичайний http (див. HTTP вище).
  2. Клієнт отримує запитувану веб-сторінку і виконує JavaScript на сторінці, яка відкриває з'єднання з сервером.
  3. Сервер та клієнт тепер можуть надсилати один одному повідомлення, коли будуть доступні нові дані (з обох боків).

    • Трафік у режимі реального часу від сервера до клієнта та від клієнта до сервера
    • Ви хочете використовувати сервер, який має цикл подій
    • За допомогою WebSockets можна з'єднатися із сервером з іншого домену.
    • Також можливо використовувати сторонній сервер веб-сокетів, наприклад, Pusher або інші . Таким чином, вам доведеться реалізувати лише клієнтську сторону, що дуже просто!
    • Якщо ви хочете прочитати більше, я вважаю це дуже корисним: ( стаття ), (стаття) ( навчальний посібник ).

WebSockets HTML5

Комета:

Комета - це сукупність методів до HTML5, які використовують потокове та тривале опитування для досягнення додатків у реальному часі. Детальніше читайте на wikipedia або цій статті.


Тепер, який з них я повинен використовувати для програми в реальному часі (що мені потрібно кодувати). Я багато чув про веб-розетки (з socket.io [бібліотека node.js]), але чому б не PHP?

Ви можете використовувати PHP з WebSockets, перевірити Ratchet .


21
Це круто! Я читаю на SSE і знайшов цю статтю, це дуже приємно - як я зараз порівнював речі, чи можна також сюди включити SSE, щоб ми також могли перехресно перевірити, чи є різниця з Websocket?
індекс

1
@Tieme О, це було? Я подумав, що SSE означає події, надіслані сервером. У будь-якому випадку, дякую, я зараз це бачу.
індекс

1
Питання: у php скажімо, що за допомогою веб-сокета кожен клієнт, підключений до мого сервера, використовує ws: мав би один потік виділений йому / її, і його розмір складе ~ 2 Мб, як це стосується звичайних запитів? як це буде відрізнятися у nodejs? Скільки одночасно клієнтів можуть обробляти nodejs і коли це порушує те, що відбувається?
Мухаммед Умер

5
Ви можете виконати те саме з обома рішеннями, але механізм інший. Довге опитування використовує "звичайні" дані http, SSE використовує інший базовий протокол і потребує іншої установки сервера в порівнянні з тривалим опитуванням.
Тієм

2
Добре, ви можете використовувати апаш, якщо хочете. Але багато людей використовують Node.js, оскільки він має цикл подій. Але про Apache дивіться stackoverflow.com/questions/12203443/…
Tieme

37

Тіме доклав багато зусиль для своєї чудової відповіді, але я думаю, що суть питання ОП полягає в тому, як ці технології стосуються PHP, а не як кожна технологія працює.

PHP - це найпоширеніша мова у веб-розробці, окрім очевидних клієнтів на HTML, css та javascript. Однак у PHP є дві основні проблеми, що стосуються програм у реальному часі:

1) PHP почався як дуже базовий CGI. PHP прогресував дуже далеко, так як на ранній стадії, але це сталося невеликими кроками. У PHP вже було багато мільйонів користувачів до того часу, як це стало вбудованою та гнучкою бібліотекою С, що є сьогодні, більшість з яких залежала від попередньої моделі виконання, тому вона ще не зробила серйозної спроби уникнути cgi модель внутрішньо. Навіть інтерфейс командного рядка викликає бібліотеку PHP (libphp5.so в Linux, php5ts.dll у Windows тощо), як ніби це все ще cgi, що обробляє GET / POST-запит. Він все ще виконує код так, ніби він просто повинен створити "сторінку", а потім закінчити свій життєвий цикл. Як результат, у нього дуже мала підтримка багатопотокового або керованого подіями програмування (у просторі користувачів PHP), що робить його наразі непрактичним для багатокористувацьких програм у режимі реального часу.

Зауважте, що PHP має розширення для забезпечення циклів подій (наприклад, libevent) та потоків (таких як pthreads) у просторі користувачів PHP, але дуже, дуже мало хто з програм використовує ці.

2) PHP все ще має значні проблеми зі збиранням сміття. Хоча ці проблеми постійно вдосконалюються (швидше за все, це найбільший крок для припинення життєвого циклу, як описано вище), навіть найкращі спроби створення довготривалих програм PHP вимагають регулярного перезавантаження. Це також робить непрактичним для додатків у режимі реального часу.

PHP 7 буде чудовим кроком для вирішення цих проблем, і здається дуже перспективним як платформа для додатків у режимі реального часу.


2
Одне невелике виправлення: PHP завжди було написано на мові C, як це можна побачити тут: museum.php.net/php1 Крім того, "менш вживаний (але надзвичайно популярний)" є досить суперечливим; можливо, що ти маєш на увазі "більш модне"?
IMSoP

@IMSoP - Дякую за виправлення, я використовую PHP вже більше десяти років і завжди був під враженням, що його коріння було в Perl. Сторінка історії PHP чітко підтверджує, що вона спочатку була також і С. Я відредагую свою відповідь, як тільки знайду мить.
JSON

Я видалю трохи про Perl, оскільки він не добре поєднується з офіційною документацією, але це все ще заплутаний напрям ранньої розробки PHP.
JSON

PHP 7 здається дуже перспективним як платформа для додатків у режимі реального часу? Яке поліпшення / зміна PHP7 для додатків у режимі реального часу?
Я повернусь


9

Я намагався зазначити це, збирав і писав приклади з точки зору Java .

HTTP для розробників Java

Реверс Аякс - старий стиль

Обробка асинхронізації на стороні сервера

Реверс Аякс - Новий стиль

Сервер надсилає події

Помістіть його тут для будь-якого розробника Java, який вивчає ту саму тему.


більшість із цих сайтів не працюють!
Олександр Данн

@AlexanderDunn дякую за те, що ви виклали це. Я виправлю це оновленими посиланнями
Іван

1

Ви можете легко використовувати Node.JS у своєму веб-додатку лише для спілкування в режимі реального часу. Node.JS справді потужний, коли мова йде про WebSockets. Тому "Сповіщення PHP через Node.js" було б чудовою концепцією.

Дивіться цей приклад: Створення програми чату в режимі реального часу за допомогою PHP та Node.js

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.