Chat PHP com XHR Long Polling
Esses dias surgiu a questão da melhor forma de notificar o usuário sobre alterações no servidor em tempo (quase) real, como novas mensagens de um chat, por exemplo.
A forma mais intuitiva pra mim seria fazer requisições XMLHttpRequest em pequenos intervalos, checando por mensagens mais novas que a última mensagem já recebida. Este método, entretanto, desperdiçaria muitas requisições se o intervalo fosse muito curto ou comprometeria a experiência do usuário se o intervalo fosse maior.
A idéia proposta é manter uma única conexão XHR aberta enquanto o servidor não responder com uma mensagem nova. Uma vez que exista mensagens novas, o cliente processa a resposta e em seguida cria uma nova conexão XHR que permanecerá aberta até a próxima resposta. Dessa forma o cliente fará no máximo 1 requisição por mensagem.
Depois eu acabei descobrindo que esta é a implementação de XMLHttpRequest long polling.
O código funciona da seguinte forma:
Ajax:
url: 'chat.php?ultimo_id=' + ultimo_id
success:
processar retorno json
guardar ultimo_id
complete:
executar requisição novamente
PHP:
Loop infinito:
consultar mensagens mais novas que ultimo_id
se houver mensagens:
escrever mensagens em json
parar o loop para o cliente ler o json
Funcionou muito bem em rede local com 16 clientes, cada um enviando uma mensagem por segundo. As mensagens ficaram no MySQL numa tabela na memória com Query Cache habilitado e não tive problemas com processamento do banco, ficando sempre abaixo de 6%. O Apache também não sofreu sobrecarga, tendo no máximo 3% de CPU em cada um dos 3 processos.
Sem dúvida esta implementação tem menos overhead que requisições em pequenos intervalos. Melhor que isso somente a implementação de streaming com XMLHttpRequest, que não fecharia a conexão a cada mensagem nova, mas isso fica pra depois utilizando requisições multipart.
Código-fonte:
http://code.google.com/p/chatildis/source/browse/trunk/chat.php?r=7
Script para download:
http://chatildis.googlecode.com/files/chat.php




Muito bom esse artigo, porem os lilnks de exemplos e de download não estão funcionando.
[...] já tinha publicado um Chat em PHP utilizando Long Polling e acabei reescrevendo parte dele para utilizar XMLHttpRequest com requisição [...]