O que são pesquisas longas, Websockets, eventos enviados pelo servidor (SSE) e cometa?


1048

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

Alguém gostaria de me explicar o que são essas tecnologias:

  1. Votação longa
  2. Eventos Enviados pelo Servidor
  3. Websockets
  4. Cometa

Uma coisa que me deparei sempre foi que o servidor mantém uma conexão aberta e envia dados ao 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 devo usar para um aplicativo em tempo real. Eu tenho ouvido muito sobre websockets (com socket.io [uma biblioteca node.js]), mas por que não PHP?


1
Websocket ou webrtc em tempo real? Existe uma biblioteca para websocket no php, você precisa escrever um código extra para que ele funcione usando o ZMQ ou apenas programação de soquetes, o nodeJs é construído para isso, para que seja facilmente disponível. A razão pela qual o websocket não está prontamente disponível no php é que você precisa executar um terminal extra e mantê-lo em funcionamento para que o servidor do websocket esteja prontamente disponível, você terá dois servidores. e a estrutura, php não é uma estrutura de eventos como javascript; portanto, o websocket usa uma estrutura de eventos para capturar e enviar mensagens.
PauAI

Além disso: os eventos Comet e ServerSent são a solução alternativa do PHP para atingir quase em tempo real (na verdade não) sem a criação de 2 servidores.
precisa saber é o seguinte

Respostas:


2077

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

Antes de entender essas tecnologias, você deve entender primeiro o tráfego HTTP clássico da Web.

HTTP regular:

  1. Um cliente solicita uma página da web de um servidor.
  2. O servidor calcula a resposta
  3. O servidor envia a resposta ao cliente.

HTTP

Pesquisa do Ajax:

  1. Um cliente solicita uma página da Web de um servidor usando HTTP comum (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 segundos).
  3. O servidor calcula cada resposta e a envia de volta, assim como o tráfego HTTP normal.

Ajax Polling

Pesquisa longa do Ajax:

  1. Um cliente solicita uma página da Web de um servidor usando HTTP comum (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.

Pesquisa longa do Ajax

Eventos enviados por servidor HTML5 (SSE) / Fonte de eventos:

  1. Um cliente solicita uma página da Web de um servidor usando HTTP comum (consulte HTTP acima).
  2. O cliente recebe a página da web solicitada e executa o JavaScript na página que abre uma conexão com o servidor.
  3. O servidor envia um evento para o cliente quando há novas informações disponíveis.

SSE HTML5

Websockets HTML5:

  1. Um cliente solicita uma página da Web de um servidor usando http normal (consulte HTTP acima).
  2. O cliente recebe a página da web solicitada e executa o JavaScript na página que abre uma conexão com o servidor.
  3. O servidor e o cliente agora podem enviar mensagens um ao outro quando novos dados (em ambos os lados) estiverem disponíveis.

    • Tráfego em tempo real do servidor para o cliente e do cliente para o servidor
    • Você desejará usar um servidor que tenha um loop de eventos
    • Com o WebSockets, é possível conectar-se a um servidor de outro domínio.
    • Também é possível usar um servidor websocket hospedado de terceiros, por exemplo, Pusher ou outros . Dessa forma, você só precisará implementar o lado do cliente, o que é muito fácil!
    • Se você quiser ler mais, achei muito útil: ( artigo ), (artigo) ( tutorial ).

WebSockets HTML5

Cometa:

Cometa é uma coleção de técnicas anteriores ao HTML5 que usam streaming e pesquisas longas para obter aplicativos em tempo real. Leia mais na wikipedia ou neste artigo.


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

Você pode usar PHP com WebSockets, confira Ratchet .


21
Isso é incrível! Estou lendo o SSE e encontrei este artigo, é muito bom - como eu já comparei coisas, você também pode incluir o SSE aqui para que possamos verificar a diferença com o Websocket?
index

1
@ Tieme Oh, foi isso? Eu pensei que SSE significava eventos enviados pelo servidor. De qualquer forma, obrigado, eu vejo agora.
index

1
P: no php, digamos que você estivesse usando o websocket, todos os clientes conectados ao meu servidor usando ws: teriam um thread alocado para ele e seu tamanho seria ~ 2mb, como é o caso de solicitações normais? como isso diferiria no nodejs? Quantos clientes simultâneos o nodejs pode manipular e quando ele quebra o que acontece?
Muhammad Umer

5
Você pode fazer o mesmo com as duas soluções, mas o mecanismo é diferente. A pesquisa longa usa dados http 'regulares', o SSE usa um protocolo subjacente diferente e precisa de uma configuração de servidor diferente em comparação à pesquisa longa.
Tieme

2
Bem, você pode usar o apache, se quiser. Mas muitas pessoas usam o Node.js porque ele possui um loop de eventos. Mas, para o Apache, consulte stackoverflow.com/questions/12203443/…
Tieme

37

Tieme se esforçou muito em sua excelente resposta, mas acho que o principal da questão dos OPs é como essas tecnologias se relacionam com o PHP, e não como cada tecnologia funciona.

PHP é a linguagem mais usada no desenvolvimento web, além do óbvio 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 pequenas etapas. O PHP já tinha muitos milhões de usuários quando se tornou a biblioteca C flexível e incorporável que é hoje, a maioria dos quais dependia de seu modelo anterior de execução, portanto ainda não fez uma tentativa sólida de escapar do modelo cgi internamente. Até a interface da linha de comando chama a biblioteca PHP (libphp5.so no linux, php5ts.dll no Windows, etc) como se ainda fosse um cgi processando uma solicitação GET / POST. Ele ainda executa o código como se tivesse que criar uma "página" e encerrar seu ciclo de vida. Como resultado, ele tem muito pouco suporte para programação multithread ou orientada a eventos (no espaço de usuário PHP), tornando-o atualmente impraticável para aplicativos multiusuário de tempo real.

Observe que o PHP possui extensões para fornecer loops de eventos (como libevent) e threads (como pthreads) no espaço do usuário do PHP, mas muito, muito, poucas aplicações os utilizam.

2) O PHP ainda tem problemas significativos com a coleta de lixo. Embora esses problemas tenham melhorado de maneira consistente (provavelmente é a melhor etapa para terminar o ciclo de vida, conforme descrito acima), mesmo as melhores tentativas de criar aplicativos PHP de execução longa exigem a reinicialização regular. Isso também o torna impraticável para aplicativos em tempo real.

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


2
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 contraditório; talvez o que você quer dizer seja "mais elegante"?
IMSoP

@ IMSoP - Obrigado pela correção, estou usando PHP há mais de uma década e sempre tive a impressão de que suas raízes estavam no Perl. A página de histórico do PHP suporta claramente que também era originalmente C. Vou editar minha resposta assim que encontrar um momento.
JSON

Vou remover um pouco do Perl, pois ele não se mistura bem com a documentação oficial, mas essa ainda é uma área confusa no desenvolvimento inicial do PHP.
JSON

O PHP 7 parece muito promissor como plataforma para aplicativos em tempo real? Que melhoria / mudança no PHP7 para aplicativos em tempo real?
Volto


9

Eu tentei fazer anotações sobre isso e coletei e escrevi exemplos de uma perspectiva java .

HTTP para desenvolvedores Java

Reverse Ajax - Estilo antigo

Manipulação assíncrona no lado do servidor

Reverse Ajax - Novo estilo

Eventos Enviados pelo Servidor

Colocando aqui para qualquer desenvolvedor Java que esteja estudando o mesmo assunto.


a maioria desses sites não funciona!
Alexander Dunn

@AlexanderDunn obrigado por abordar o assunto. Vou corrigi-lo com links atualizados
John

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.