garotosopa

Chat PHP com XHR Long Polling

Publicado em Javascript, PHP por garotosopa em Julho 27, 2008

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.

Veja também a versão mais recente do chat comet com server push utilizando XHR Multipart

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.

Veja também a versão mais recente do chat comet com server push utilizando XHR 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

Etiquetado como:, , , , , ,

2 Respostas

Subscreva aos comentários comRSS.

  1. Lucas said, on Março 25, 2009 at 6:14 pm

    Muito bom esse artigo, porem os lilnks de exemplos e de download não estão funcionando.

  2. [...] já tinha publicado um Chat em PHP utilizando Long Polling e acabei reescrevendo parte dele para utilizar XMLHttpRequest com requisição [...]


Deixe uma resposta