O que são Long-Polling, Websockets, Eventos enviados pelo servidor (SSE) e Comet?

Eu tentei ler alguns artigos, mas ainda não estou muito claro sobre os conceitos.

Alguém gostaria de tentar explicar para mim quais são essas tecnologias:

  1. Long Polling
  2. Eventos enviados pelo servidor
  3. Websockets
  4. Cometa </​​li>

Uma coisa que eu encontrei todas as vezes foi, o servidor mantém uma conexão aberta e envia dados para o cliente. Como a conexão é mantida aberta e como o cliente obtém os dados enviados? (Como o cliente usa os dados, talvez algum código possa ajudar?)

Agora, qual deles eu devo usar para um aplicativo em tempo real. Eu tenho ouvido muito sobre websockets (com socket.io [uma biblioteca node.js]) mas porque não PHP?

862
adicionado editado
Visualizações: 1
Além disso: Eventos Comet e ServerSent são a solução alternativa do PHP para alcançar quase que em tempo real (não realmente) sem criar 2 servidores.
adicionado o autor PauAI, fonte
Websocket ou webrtc em tempo real? Existe uma biblioteca para websocket em PHP, você precisa escrever código extra para que ele funcione usando o ZMQ ou apenas programação de socket, o nodeJs é construído para isso de forma que fique facilmente disponível. A razão websocket não está prontamente disponível em PHP é que você tem que executar um terminal extra e mantê-lo funcionando para que o servidor websocket esteja prontamente disponível, você terá dois servidores bottom line. e a estrutura, o PHP não é uma estrutura de eventos como o javascript, então, o websocket usa uma estrutura de evento
adicionado o autor PauAI, fonte

3 Respostas

Nos exemplos abaixo, o cliente é o navegador e o servidor é o servidor que hospeda o site.

Antes que você possa entender essas tecnologias, você precisa entender primeiro o tráfego da Web HTTP clássico .

HTTP regular:

  1. Um cliente solicita uma página da Web de um servidor.
  2. O servidor calcula a resposta </​​li>
  3. O servidor envia a resposta ao cliente.

HTTP

Polling Ajax:

  1. Um cliente solicita uma página da web de um servidor usando HTTP regular (consulte HTTP acima).
  2. O cliente recebe a página da Web solicitada e executa o JavaScript na página que solicita um arquivo do servidor em intervalos regulares (por exemplo, 0,5 segundo).
  3. O servidor calcula cada resposta e a envia de volta, exatamente como o tráfego HTTP normal.

Ajax Polling

Ajax Long-Polling:

  1. Um cliente solicita uma página da web de um servidor usando HTTP regular (consulte HTTP acima).
  2. O cliente recebe a página da Web solicitada e executa o JavaScript na página que solicita um arquivo do servidor.
  3. O servidor não responde imediatamente com as informações solicitadas, mas aguarda até que haja novas informações disponíveis.
  4. Quando há novas informações disponíveis, o servidor responde com as novas informações.
  5. O cliente recebe as novas informações e envia imediatamente outra solicitação ao servidor, reiniciando o processo.

Ajax Long-Polling

Eventos enviados pelo servidor HTML5 (SSE)/EventSource:

  1. A client requests a webpage from a server using regular HTTP (see HTTP above).
  2. The client receives the requested webpage and executes the JavaScript on the page which opens a connection to the server.
  3. 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
    • Not possible to connect with a server from another domain
    • If you want to read more, I found these very useful: (article), (article), (article), (tutorial).

HTML5 SSE

Websockets HTML5:

  1. A client requests a webpage from a server using regular http (see HTTP above).
  2. The client receives the requested webpage and executes the JavaScript on the page which opens a connection with the server.
  3. 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

Cometa:

O Comet é uma coleção de técnicas anteriores ao HTML5 que usa streaming e long polling para obter aplicativos em tempo real. Leia mais sobre wikipedia ou este artigo .


Agora, qual deles eu devo usar para um aplicativo em tempo real (que eu preciso   código). Eu tenho ouvido muito sobre websockets (com socket.io [um   biblioteca node.js]) mas porque não PHP?

Você pode usar PHP com WebSockets, confira Ratchet .

1840
adicionado
Qual é a diferença real entre SSE e Websockets?
adicionado o autor Basj, fonte
Por que você diz para não usar o apache?
adicionado o autor bobzer, fonte
Eu não conseguia entender as diferenças de comet e ajax long polling . Em ambas as técnicas, estamos (como cliente) enviando uma solicitação ajax e aguardando com uma solicitação HTTP aberta para uma resposta do servidor. @Me amarre
adicionado o autor Eray, fonte
P: em PHP, digamos que você estivesse usando websocket, todos os clientes conectados ao meu servidor usando ws: teriam um thread alocado a ele/ela e seu tamanho seria ~ 2mb, como é o caso das solicitações normais? como isso seria diferente no nodejs? Quantos clientes simultâneos podem manipular o nodejs e quando ele quebra o que acontece?
adicionado o autor Muhammad Umer, fonte
@Tieme Oh foi isso? Eu pensei que SSE significava Eventos enviados pelo servidor. De qualquer forma, obrigado, vejo agora.
adicionado o autor index, fonte
Isso é incrível! Estou lendo sobre o SSE e encontrei este artigo, é muito bom - como se eu tivesse comparado coisas, você também pode incluir o SSE aqui para que possamos também verificar a diferença com o Websocket?
adicionado o autor index, fonte
@Tieme Qual será o melhor método para recuperar dados como cliente para usuários do android do servidor web-socket?
adicionado o autor Apple Appala, fonte
Seria bom se essa resposta fosse mais explícita sobre a tecnologia subjacente. Quais conexões TCP são usadas? As segundas conexões são estabelecidas sobre a primeira usada para fazer a solicitação original? Como o pipelining de HTTP está envolvido?
adicionado o autor Charlie, fonte
Você pode realizar o mesmo com as duas soluções, mas o mecanismo é diferente. Long-polling usa dados HTTP "regulares", o SSE usa um protocolo subjacente diferente e precisa de uma configuração de servidor diferente em comparação com a pesquisa longa.
adicionado o autor Tieme, fonte
@Eray, você leu o último parágrafo e seguiu o URL para mais informações sobre o cometa?
adicionado o autor Tieme, fonte
Bem, você poderia usar o apache se quiser. Mas muitas pessoas usam o Node.js porque ele tem um loop de eventos. Mas para o Apache, veja PHP nativo para sockets web disponível% 2312204603 "> stackoverflow.com/questions/12203443/…
adicionado o autor Tieme, fonte
Eu concordo, você tem esse conhecimento ou conhece um usuário que tem?
adicionado o autor Tieme, fonte
Eu acho que deveria ser: "o cliente executa o JavaScript na página", então este é o navegador, não o servidor. Claro?
adicionado o autor Tieme, fonte
você acertou em cheio ... resposta incrível
adicionado o autor kunal, fonte
Você pode me sugerir qual Protocolo Comet será usado para o Spring MVC.
adicionado o autor Yasir Shabbir Choudhary, fonte
@Tieme qual é a diferença entre SSE e puxar muito tempo? De suas palavras, elas são quase as mesmas.
adicionado o autor tomwang1013, fonte
Apenas para adicionar ao que o @Tieme já respondeu, as limitações do SSE e do WS podem ser tratadas da seguinte maneira: O problema de reconexão do WS pode ser resolvido usando uma biblioteca cliente apropriada, por exemplo awesome-websocket . O problema do servidor de origem cruzada do SSE pode ser resolvido por enviando CORS na resposta
adicionado o autor Piyush Kansal, fonte
Eu acho que o Long Polling (e provavelmente o comet também) será limitado pela infraestrutura de rede que reforça o curto tempo de espera no HTTP.
adicionado o autor Ced, fonte
@Tieme Eu estava perdido com sua explicação no ponto em que você estava explicando sobre Ajax Polling e você disse "Um cliente solicita uma página da Web de um servidor usando HTTP regular (veja HTTP acima) e depois A página da web solicitada executa JavaScript ... "Como um servidor web regular (por exemplo, apache)" executa JavaScript "?
adicionado o autor Olowookere Emmanuel, fonte

Tieme fez um grande esforço em sua excelente resposta, mas acho que o núcleo da questão dos OPs é como essas tecnologias se relacionam com o PHP, em vez de como cada tecnologia funciona.

PHP é a linguagem mais utilizada no desenvolvimento web, além do óbvio lado do cliente html, CSS e javascript. No entanto, o PHP tem dois grandes problemas quando se trata de aplicativos em tempo real:

1) O PHP começou como um CGI muito básico. O PHP progrediu muito desde o estágio inicial, mas aconteceu em pequenos passos. O PHP já tinha muitos milhões de usuários no momento em que se tornou a biblioteca C flexível e incorporável que é hoje, a maioria dos quais eram dependentes de seu modelo anterior de execução, então ele ainda não fez uma tentativa sólida de escapar do modelo cgi internamente. Até mesmo a interface de linha de comando invoca a biblioteca PHP (libphp5.so no linux, php5ts.dll no windows, etc) como se ainda fosse um cgi processando uma requisição GET/POST. Ele ainda executa o código como se tivesse que construir uma "página" e terminar seu ciclo de vida. Como resultado, ele tem muito pouco suporte para programação multi-thread ou orientada a eventos (dentro do espaço de usuário do PHP), tornando atualmente impraticável para aplicações multiusuário em tempo real.

Note que o PHP tem extensões para fornecer loops de eventos (como libevent) e threads (como pthreads) no espaço do usuário do PHP, mas muito, muito, poucos aplicativos os usam.

2) O PHP ainda tem problemas significativos com a coleta de lixo. Embora esses problemas tenham sido consistentemente aprimorados (provavelmente é o maior passo para terminar o ciclo de vida conforme descrito acima), até mesmo as melhores tentativas de criar aplicativos PHP de longa execução exigem que sejam reiniciadas regularmente. Isso também torna impraticável aplicativos em tempo real.

O PHP 7 será um ótimo passo para corrigir esses problemas também, e parece muito promissor como uma plataforma para aplicativos em tempo real.

31
adicionado
O PHP 7 parece muito promissor como uma plataforma para aplicativos em tempo real? Que melhoria/mudança no PHP7 para aplicações em tempo real?
adicionado o autor I'll-Be-Back, fonte
Uma pequena correção: o PHP sempre foi escrito em C, como pode ser visto aqui: museum.php.net/php1 Além disso, "menos usado (mas imensamente mais popular)" é bastante autocontraditório; talvez o que você quer dizer seja "mais elegante"?
adicionado o autor IMSoP, fonte
embora também svn.php. net/viewvc/phpdoc/pt/trunk/apêndices/& hellip; && PHP "rel =" nofollow noreferrer "> web.archive.org/web/20090426061624/http://us3.php.net/…
adicionado o autor eis, fonte
adicionado o autor eis, fonte
@ I'll-Be-Back - gerenciamento de memória fixa/coleta de lixo, compilação JIT, etc.
adicionado o autor JSON, fonte
Eu removerei o bit do Perl já que ele não combina bem com a documentação oficial, mas esta ainda é uma área confusa no desenvolvimento inicial do PHP.
adicionado o autor JSON, fonte
@IMSoP - Obrigado pela correção, uso o PHP há mais de uma década e sempre tive a impressão de que suas raízes eram em Perl. A página do histórico do PHP confirma claramente que ele era originalmente o C também. Vou editar minha resposta assim que encontrar um momento.
adicionado o autor JSON, fonte
Por favor, edite sua resposta sobre raízes de php.
adicionado o autor Netverse, fonte

Eu tentei anotar sobre isso e coletei e escrevi exemplos de uma perspectiva java .

HTTP para desenvolvedores de Java

Ajax reverso - estilo antigo

Manipulação assíncrona no lado do servidor

Reverse Ajax - Novo estilo

Eventos enviados pelo servidor

Colocá-lo aqui para qualquer desenvolvedor java que está olhando para o mesmo assunto.

7
adicionado
Todos os links estão mortos agora
adicionado o autor SpringLearner, fonte
@SpringLearner obrigado por anotar isso. Eu atualizei os links
adicionado o autor John, fonte