Что такое Long-Polling, Websockets, Server-Sent Events (SSE) и Comet?
Я пытался читать некоторые статьи, но у меня все еще недостаточно ясное понимание концепций.
Не мог бы кто-нибудь объяснить мне, что такое следующие технологии:
- Long Polling
- Server-Sent Events
- Websockets
- Comet
Каждый раз, когда я встречал информацию, говорилось, что сервер поддерживает открытое соединение и отправляет данные клиенту. Как это соединение удерживается открытым, и как клиент получает отправленные данные? (Как клиент использует эти данные, может быть, код был бы полезен?)
Теперь, какую из этих технологий мне следует использовать для реального приложения в режиме реального времени? Я много слышал о Websockets (с библиотекой socket.io для Node.js), но почему бы не PHP?
2 ответ(ов)
PHP — это самый распространенный язык в веб-разработке, помимо очевидных технологий клиентской стороны, таких как HTML, CSS и JavaScript. Тем не менее, у PHP есть две основные проблемы в контексте реальных приложений:
- PHP изначально был очень простым CGI. Несмотря на то что PHP значительно развился с тех пор, его эволюция происходила небольшими шагами. К моменту, когда он стал встроенной и гибкой библиотекой на C, у него уже было много миллионов пользователей, которые зависели от более ранней модели выполнения. В результате PHP еще не предпринял серьезной попытки выйти за рамки модели CGI. Даже интерфейс командной строки вызывает библиотеку PHP (
libphp5.so
на Linux,php5ts.dll
на Windows и т.д.), словно он все еще обрабатывает GET/POST запросы. PHP продолжает выполнять код так, как будто его задача — лишь построить «страницу» и завершить жизненный цикл. В итоге внутри пространства пользователя PHP почти нет поддержки многопоточности или событийной обработки, что делает его непрактичным для реальных многопользовательских приложений.
Стоит отметить, что у PHP есть расширения для реализации циклов событий (например, libevent
) и потоков (например, pthreads
) в пространстве пользователя, но такие возможности используются очень и очень редко.
- В PHP все еще есть серьезные проблемы с сборкой мусора. Хотя эти проблемы последовательно улучшаются (вероятно, это самый большой шаг к завершению жизненного цикла, как описано выше), даже лучшие попытки создать долгоиграющие PHP-приложения требуют регулярного перезапуска. Это также делает PHP непрактичным для реальных приложений.
PHP 7 станет значительным шагом к решению этих проблем и выглядит многообещающим как платформа для реальных приложений.
Пуллинг
По сути, пуллинг — это техника запроса информации у сервера через регулярные интервалы времени. Это соединение осуществляется с использованием HTTP-протокола. Существует два типа пуллинга:
- Короткий пуллинг (Short Polling)
- Долгий пуллинг (Long Polling)
Короткий пуллинг
В коротком пуллинге клиент запрашивает информацию у сервера. Сервер обрабатывает запрос. Если данные доступны, сервер отвечает с нужной информацией. Однако если у сервера нет доступных данных для клиента, он возвращает пустой ответ. В обоих случаях соединение будет закрыто после возврата ответа. Клиенты продолжают отправлять новые запросы даже после получения пустых ответов от сервера. Этот механизм увеличивает сетевые затраты на сервере.
Долгий пуллинг
В долгом пуллинге клиенты могут запрашивать информацию у сервера с ожиданием, что сервер может не ответить мгновенно. Когда сервер получает запрос, если у него нет свежих данных для клиента, он не возвращает пустой ответ, а оставляет запрос открытым и ждет, пока поступят данные. Когда сервер получает новые данные, он немедленно отправляет ответ клиенту, завершая открытый запрос. Клиент может отправить новый запрос для обновлений после того, как получит ответ от сервера. Долгий пуллинг снижает затраты, уменьшая количество пустых ответов.
WebSocket
WebSocket — это протокол, который обеспечивает двусторонние (бидирекционные) каналы связи по одному TCP-соединению. WebSocket обеспечивает постоянное соединение между клиентом и сервером, позволяя обеим сторонам начинать передачу данных в любой момент. Рукопожатие WebSocket — это процедура, с помощью которой клиент устанавливает соединение WebSocket. Если операция successful, сервер и клиент могут отправлять и получать данные в любое время. Чаще всего используется в веб-приложениях реального времени, таких как WhatsApp или Uber.
События, отправляемые сервером (SSE)
В отличие от WebSocket, в случае SSE мы не можем отправлять запросы от клиента к серверу, так как это одностороннее соединение. Когда нам требуется "почти реальное время" передачи данных от сервера к клиенту или если сервер генерирует данные в цикле, SSE является идеальным выбором.
Комета (Comet)
Комета — это парадигма проектирования веб-приложений, которая описывает непрерывное, двустороннее взаимодействие между сервером и веб-браузером, используя стандартные методы HTTP. Комета является обобщающим термином. Ajax Push, HTTP Streaming и HTTP Server Push — это некоторые из HTTP-механизмов, которые могут использоваться для обеспечения этого событийно-ориентированного взаимодействия.
Как вывести ошибки PHP на экран?
UTF-8 на всех уровнях!
Функции startsWith() и endsWith() в PHP
Что такое потокобезопасность и непотокобезопасность в PHP?
Как получить расширение файла в PHP?