Вопрос по comet, long-polling, php, server-sent-events, websocket – Что такое Long-Polling, Websockets, Server-Sent Events (SSE) и Comet?

931

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

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

Long Polling Server-Sent Events Websockets Comet

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

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

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

Ваш Ответ

3   ответа
35

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

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

In the examples below the client is the browser and the server is the webserver hosting the website.

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

Regular HTTP: A client requests a webpage from a server. The server calculates the response The server sends the response to the client.

HTTP

Ajax Polling: A client requests a webpage from a server using regular HTTP (see HTTP above). The client receives the requested webpage and executes the JavaScript on the page which requests a file from the server at regular intervals (e.g. 0.5 seconds). The server calculates each response and sends it back, just like normal HTTP traffic.

Ajax Polling

Ajax Long-Polling: A client requests a webpage from a server using regular HTTP (see HTTP above). The client receives the requested webpage and executes the JavaScript on the page which requests a file from the server. The server does not immediately respond with the requested information but waits until there's new information available. When there's new information available, the server responds with the new information. The client receives the new information and immediately sends another request to the server, re-starting the process.

Ajax Long-Polling

HTML5 Server Sent Events (SSE) / EventSource: A client requests a webpage from a server using regular HTTP (see HTTP above). The client receives the requested webpage and executes the JavaScript on the page which opens a connection to the server.

The server sends an event to the client when there's new information available.

Real-time traffic from server to client, mostly that's what you'll need You'll want to use a server that has an event loop Connections with servers from other domains are only possible with correct CORS settings If you want to read more, I found these very useful: (article), (article), (article), (tutorial).

HTML5 SSE

HTML5 Websockets: A client requests a webpage from a server using regular http (see HTTP above). The client receives the requested webpage and executes the JavaScript on the page which opens a connection with the server.

The server and the client can now send each other messages when new data (on either side) is available.

Real-time traffic from the server to the client and from the client to the server You'll want to use a server that has an event loop With WebSockets it is possible to connect with a server from another domain. It is also possible to use a third party hosted websocket server, for example Pusher or others. This way you'll only have to implement the client side, which is very easy! If you want to read more, I found these very useful: (article), (article) (tutorial).

HTML5 WebSockets

Comet:

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

Now, which one of them should I use for a realtime app (that I need to code). I have been hearing a lot about websockets (with socket.io [a node.js library]) but why not PHP ?

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

@Tieme Ой это было? Я думал, что SSE означает «Отправленные сервером события». В любом случае, спасибо, я вижу это сейчас.
Ну, вы можете использовать Apache, если хотите. Но многие люди используют Node.js, потому что он имеет цикл обработки событий. Но для Apache, см.stackoverflow.com/questions/12203443/…
Это круто! Я читал о SSE и нашел эту статью, она очень хорошая - как я сейчас сравнивал материал, можете ли вы также включить SSE здесь, чтобы мы могли также перепроверить его разницу с Websocket?
Вы можете сделать то же самое с обоими решениями, но механизм отличается. Длинный опрос использует «обычный» Для данных http SSE использует другой базовый протокол и требует другой настройки сервера по сравнению с длительным опросом.
Q: в php, скажем, вы используете websocket, будет ли у каждого клиента, подключенного к моему серверу, используя ws: один поток, выделенный ему / ей, и его размер будет ~ 2 МБ, как в случае с обычными запросами? как это будет отличаться в nodejs? Сколько одновременных клиентов может обработать nodejs, и когда происходит сбой, что происходит?

Похожие вопросы