Что такое Long-Polling, Websockets, Server-Sent Events (SSE) и Comet?


1048

Я попытался прочитать некоторые статьи, но я еще не очень разбираюсь в понятиях.

Кто-нибудь хотел бы попытаться объяснить мне, что это за технологии:

  1. Длинный опрос
  2. Отправленные сервером события
  3. WebSockets
  4. комета

Одна вещь, с которой я сталкивался каждый раз: сервер держит соединение открытым и передает данные клиенту. Как соединение остается открытым и как клиент получает отправленные данные? (Как клиент использует данные, может быть, какой-то код может помочь?)

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


1
Веб-сокет в реальном времени или webrtc? В php есть библиотека для websocket, вам нужно написать дополнительный код для того, чтобы он работал с использованием ZMQ или просто программирования сокетов, для этого создан nodeJs, поэтому он легко доступен. Причина, по которой websocket недоступен в php, заключается в том, что вам нужно запустить дополнительный терминал и поддерживать его в рабочем состоянии, чтобы сервер websocket был доступен, и у вас будет два нижних результата. и структура php не является структурой событий, как javascript, поэтому websocket использует структуру событий для перехвата и отправки сообщений.
PauAI

Дополнительно: Comet и ServerSent Events - это обходной путь PHP для достижения почти в реальном времени (не совсем) без создания 2 серверов.
PauAI

Ответы:


2077

В приведенных ниже примерах клиент является браузером, а сервер - веб-сервером, на котором размещается веб-сайт.

Прежде чем вы сможете понять эти технологии, вы должны сначала понять классический веб-трафик HTTP.

Обычный HTTP:

  1. Клиент запрашивает веб-страницу с сервера.
  2. Сервер вычисляет ответ
  3. Сервер отправляет ответ клиенту.

HTTP

Аякс Поллинг:

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

Аякс Поллинг

Ajax Long-Polling:

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

Аякс Лонг-Поллинг

Сервер отправил события HTML5 (SSE) / EventSource:

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

    • Трафик в реальном времени от сервера к клиенту, в основном это то, что вам нужно
    • Вы хотите использовать сервер, который имеет цикл событий
    • Соединения с серверами из других доменов возможны только при правильных настройках CORS
    • Если вы хотите прочитать больше, я нашел это очень полезным: (статья) , (статья) , (статья) , (учебник) .

HTML5 SSE

HTML5 Websockets:

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

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

HTML5 WebSockets

Comet:

Comet - это набор методов, предшествующих HTML5, которые используют потоковую передачу и длинный опрос для создания приложений в реальном времени. Читайте больше на википедии или этой статье.


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

Вы можете использовать PHP с WebSockets, посмотрите Ratchet .


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

1
@Tieme Ой это было? Я думал, что SSE означает «Отправленные сервером события». В любом случае, спасибо, я вижу это сейчас.
индекс

1
Q: в php предположим, что вы используете websocket, будет ли у каждого клиента, подключенного к моему серверу, используя ws: один поток, выделенный ему / ей, и его размер будет ~ 2 МБ, как в случае с обычными запросами? как это будет отличаться в nodejs? Сколько одновременных клиентов может обработать nodejs, и когда происходит сбой, что происходит?
Мухаммед Умер

5
Вы можете сделать то же самое с обоими решениями, но механизм отличается. При длинном опросе используются «обычные» http-данные, SSE использует другой базовый протокол и требует другой настройки сервера по сравнению с длинным опросом.
Время

2
Ну, вы можете использовать Apache, если хотите. Но многие люди используют Node.js, потому что он имеет цикл обработки событий. Но для Apache, см. Stackoverflow.com/questions/12203443/…
Tieme

37

Tieme приложил немало усилий, чтобы найти отличный ответ, но я думаю, что суть вопроса OP заключается в том, как эти технологии связаны с PHP, а не как каждая технология работает.

PHP является наиболее используемым языком в веб-разработке, помимо очевидной клиентской части html, css и javascript. Тем не менее, PHP имеет 2 основных проблемы, когда речь идет о приложениях реального времени:

1) PHP начинался как очень простой CGI. PHP продвинулся очень далеко с ранней стадии, но это происходило небольшими шагами. PHP уже имел много миллионов пользователей к тому времени, когда он стал встраиваемой и гибкой библиотекой C, которой он является сегодня, большинство из которых зависело от своей более ранней модели выполнения, поэтому он еще не сделал твердой попытки избежать модель 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 явно подтверждает, что она изначально была C. Я отредактирую свой ответ, как только найду момент.
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.