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

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

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

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

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

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

Ответ 1

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

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

Обычный HTTP:

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

HTTP

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

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

Ajax Polling

Ajax Long-Polling:

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

Ajax Long-Polling

Сервер отправил события 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, которые используют потоковую передачу и длительный опрос для создания приложений в реальном времени. Читайте больше на википедии или этой статье.


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

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

Ответ 2

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 станет отличным шагом для решения этих проблем, и он кажется очень перспективным как платформа для приложений реального времени.

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Вы можете легко использовать Node.JS в своем веб-приложении только для общения в реальном времени. Node.JS действительно мощный, когда речь идет о WebSockets. Поэтому "Уведомления PHP через Node.js" были бы отличной концепцией.

Посмотрите этот пример: Создание приложения для чата в реальном времени с PHP и Node.js