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

929

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

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

  • Длительный опрос
  • События, отправленные сервером
  • WebSockets
  • Comet

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

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

  • 1
    Веб-сокет в реальном времени или webrtc? В php есть библиотека для websocket, вам нужно написать дополнительный код для того, чтобы он работал с использованием ZMQ или просто программирования сокетов, для этого создан nodeJs, поэтому он легко доступен. Причина, по которой websocket недоступен в php, заключается в том, что вам нужно запустить дополнительный терминал и поддерживать его в рабочем состоянии, чтобы сервер websocket был доступен, у вас будет два нижних результата. и структура php не является структурой событий, подобной javascript, поэтому websocket использует структуру событий для захвата и отправки сообщений.
  • 0
    Дополнительно: Comet и ServerSent Events - это обходной путь PHP для достижения почти реального времени (не совсем) без создания 2 серверов.
Теги:
websocket
server-sent-events
long-polling
comet

3 ответа

1775
Лучший ответ

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

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

Обычный HTTP:

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

Изображение 718

Опрос Ajax:

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

Изображение 719

Ajax Long-Polling:

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

Изображение 720

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

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

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

Изображение 721

Веб-узлы HTML5:

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

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

Изображение 722

Comet:

Комета представляет собой набор методов до HTML5, которые используют потоковое и длительное опрос для достижения приложений реального времени. Подробнее о wikipedia или этой статье.


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

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

  • 16
    Это круто! Я читал о SSE и нашел эту статью, она очень хорошая - как я сейчас сравнил материал, можете ли вы также включить SSE здесь, чтобы мы могли также перепроверить его разницу с Websocket?
  • 1
    @Tieme Ой это было? Я думал, что SSE означает «Отправленные сервером события». В любом случае, спасибо, я вижу это сейчас.
Показать ещё 18 комментариев
33

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

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

1) PHP начинался как очень простой CGI. PHP продвинулся очень далеко с раннего этапа, но это произошло небольшими шагами. У PHP уже было много миллионов пользователей к тому времени, когда он стал внедряемой и гибкой библиотекой C, которой он является сегодня, большинство из которых зависело от него более ранней модели исполнения, поэтому оно еще не предприняло твердую попытку избежать cgi модель внутри. Даже интерфейс командной строки вызывает библиотеку PHP (libphp5.co на linux, php5ts.dll на окнах и т.д.), Как будто он все еще обрабатывает cgi с запросом GET/POST. Он по-прежнему выполняет код, как будто ему просто нужно создать "страницу", а затем завершить жизненный цикл. В результате он очень мало поддерживает многопоточное или управляемое событиями программирование (в пользовательском пространстве PHP), что делает его в настоящее время нецелесообразным для многопользовательских приложений в режиме реального времени.

Обратите внимание, что PHP имеет расширения для предоставления циклов событий (таких как libevent) и потоков (например, pthreads) в пользовательском пространстве PHP, но очень, очень немногие из них используют их.

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

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

  • 1
    Одно небольшое исправление: PHP всегда был написан на C, как можно увидеть здесь: museum.php.net/php1 Кроме того, «менее используемый (но чрезвычайно популярный)» довольно противоречив; может быть, что вы имеете в виду "более модно"?
  • 0
    @IMSoP - Спасибо за исправление, я использую PHP уже более десяти лет, и у меня всегда было впечатление, что его корни были в Perl. Страница истории PHP явно поддерживает то, что изначально она была C. Я отредактирую свой ответ, как только найду момент.
Показать ещё 6 комментариев
8

Я попытался сделать заметку об этих и собрал и написал примеры из java перспективы.

HTTP для разработчиков Java

Обратный Ajax - Старый стиль

Асинхронная обработка на стороне сервера

Обратный Ajax - Новый стиль

События, отправленные сервером

Поместите его здесь для любого Java-разработчика, который смотрит на тот же предмет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню