Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

micox

[Resolvido] Long Polling

Recommended Posts

Opa, fiz uma pesquisinha aqui.

 

Com o ajax/javascript dá ( http://www.rodolfofadino.com.br/2011/09/usando-long-polling-com-asynccontrollers/ )

 

Agora pensando no PHP, será que dá?

 

Será que, se fizer um código como o abaixo seria considerado o Long Polling?

 

while($tempoatual < $timelimit){
 $usercode = consulta_user_banco();
 if($usercode){
   echo "usercode=".$usercode;
   exit();
 }else{
   sleep($tempo_entre_consultas);
   $tempoatual = incrementa_tempo();
 }
}
exit();

 

Veja que a conexão não será fechada (eu acho) a menos que o tempo limite do script (ou do php.ini) sejam atingidos.

O próprio PHP faz sua pausa antes de consultar novamente o banco de dados.

Com isso, o javascript poderia ter um tempo maior entre as chamadas ao php e reduziria as chamadas http.

Mas, como consequencia, teríamos um processo PHP ocupando processador e memória.

 

Isso encaixaria no Long Polling?

Valeu.

 

(moderador: se quiser quebrar isso em um novo tópico pra não zoarmos a dúvida do cara, fique à vontade :) )

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí micox... beleza?

 

Cara.. qualquer aplicação que faça uso de server push precisa ter uma engine processando os dados que serão enviados ao cliente. A abordagem do cara no artigo foi específica para ASP.NET, porém o Long Polling é o método que menos tem mistério e pode ser aplicado facilmente em qualquer linguagem de servidor. Em contra-partida à essa facilidade, temos o problema de alto consumo de tráfego. Digamos que long-polling esteja no meio-termo entre AJAX e server push.

 

Ocorre que, quando fazemos um Poll (ajax), mantemos um setInterval para que a cada período curto de tempo, uma consulta seja realizada no servidor. Então cada cliente estaria abrindo diversas conexões burras, uma atrás da outra, para verificar se há novidades no servidor.

Este processo está ilustrado aqui:

polling.jpg

 

Com long polling, mantemos a conexão aberta no servidor em cada requisição feita, e realizamos verificações em cima das novidades. Se existirem, fechamos a conexão, retornando os dados para o cliente. O cliente, ao receber estes dados abre uma nova conexão para aguardar por possíveis novidades.

Este processo está ilustrado aqui:

longpolling.jpg

E aqui tem um código em PHP comentado, que faz exatamente isso:

http://code.google.com/p/chatildis/source/browse/trunk/chat.php?r=7

 

Há dois pontos que eu alteraria nesse código acima.

1 - usleep = MICRO segundos. Ele usou 250 como valor para permitir o processador respirar durante o loop infinito. Esse valor é extremamente baixo. Leve em conta que 1s é 1000000. Poderíamos usar um timeout de 10ms, que equivale a 10000. Resumindo: usleep( 10000 ); melhora (e muito) a questão da sobrecarga da CPU, e ainda não gera perdas significativas no retorno da mensagem. Você não notaria diferença visual entre ambos.

 

2 - A verificação no script consiste-se em uma consulta ao banco de dados em cada iteração. Isso pode ser um problema, devido ao fato de você passar a sobrecarga do PHP para o banco de dados, e a CPU ser comprometida também. Você pode (e deve) utilizar outros métodos que permitam multithread. Um exemplo, seria o uso de cache, ou ainda arquivos txt, desde que você trabalhasse numa alternativa para o problema de manipulações concorrentes (multithreading). Exemplo: se mais de uma pessoa editar o arquivo ao mesmo tempo, as chances de corrompê-lo são grandes.

 

Já no Comet, abrimos uma única requisição, onde o servidor, ao receber novidades, envia ao cliente mantendo a conexão aberta.

Ilustração do processo:

comet.jpg

 

Para isso, podemos fazer uso de métodos conhecidos comumente como "Forever iframe", "Websockets", "XDomainRequest", "XHR multipart" e tantas outras...

 

Outra alternativa é utilizar o node.js, que é um servidor web que faz uso de threads não-bloqueantes, permitindo uma performance muito melhor que o Apache. Com o node, poderíamos fazer uso do socket.io, que é uma biblioteca open-source de server push completa, já com todos os métodos que citei acima (com exceção do Polling, que é um simples AJAX).

 

NodeJS: http://nodejs.org/

Socket.io: http://socket.io/

Métodos comet (transports) utilizados pelo Socket.io: http://socket.io/#browser-support

 

Há ainda o APE, que permite o uso de PHP e é open-source tb: http://www.ape-project.org/

E outros...

 

Sacou?

 

[]'s!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.