Что такое длинный опрос, Websockets, серверные события (SSE) и Comet?

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

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

  1. Опроса
  2. Сервер-Отправлено Событий
  3. Websockets
  4. Комета

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

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

3 ответов


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

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

обычный HTTP:

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

HTTP

Ajax Опрос:

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

Ajax Polling

Ajax Длинный Опрос:

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

Ajax Long-Polling

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

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

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

HTML5 SSE

HTML5 и веб-сокетов:

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

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

HTML5 WebSockets

Комета:

Comet представляет собой набор методов до HTML5, которые используют потоковое и long-polling для достижения приложений в реальном времени. Подробнее на Википедия или этой статьи.


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

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


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

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

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

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

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

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


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

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

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

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

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

Сервер Отправляет События

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