Pergunta

Como posso escrever um bate -papo em tempo real usando Xajax e PHP?

Em outras palavras, existe uma maneira de enviar respostas Xajax do servidor para vários clientes? Ou é a única possibilidade de verificar se há novas mensagens a cada poucos segundos no lado do cliente?

Foi útil?

Solução

Não. Os clientes devem "pesquisar" o servidor repetidamente.

Eu acho que a chave aqui é pensar em design de interação. O truque é enganar o usuário a pensar que o bate -papo é instantâneo, mas quando, na realidade, ele atualiza uma vez a cada 1, 2 ou 3 ou 10 segundos.

Ideias:

1) Quando o usuário enviar uma mensagem, mostre -a diretamente no bate -papo e acionar uma pesquisa.

2) Se uma pesquisa voltar com várias mensagens de outros usuários, não os adicione de uma só vez, adicione-os por um período de 1-2 segundos ou mais, com espaçamento aleatório, fazendo parecer que eles estão entrando "Instantaneamente" e de forma independente. (Se um monte de mensagens chegar imediatamente, o usuário for muito rápido em perceber que o bate -papo atualizado lá e depois, e não continuamente.)

3) Se o usuário estiver ocioso por uma quantidade de tempo. Desça a taxa de pesquisa uma vez a cada 10 segundos ou mais.

4) Se o usuário estiver ativo, ou seja, enviando muitas mensagens, pesquise com mais frequência.

5) Tenha um arquivo estático para cada canal para o qual você escreva o tempo em que o bate -papo atualizou pela última vez. Por exemplo, arquivo chat-teenfun-lastupdate.txt tem o conteúdo 1224934239 ou qualquer formato de tempo que você preferir. Sirva este arquivo estaticamente e deixe os clientes pesquisarem esse arquivo para verificar se o canal foi atualizado, mas que chama a chamada chat-poll.php?ch=teenfun Isso faz uma verificação dinâmica. Os arquivos estáticos são servidos cerca de 10 a 100 vezes mais rápido, dependendo do trabalho envolvido no script dinâmico, e você precisará disso quando receber mais de 250 usuários de pesquisa.

Boa sorte e divirta-se!

/0

Ps. Como alternativa, você pode realmente permitir que os clientes faça uma chamada AJAX para o servidor e mantê -los 'pendurados'. Ou seja, você aceita a solicitação deles e finge começar a enviar os dados de volta, mas depois faz uma pausa. Quando algo acontece, você termina a resposta com os dados da Aproporial. Para que isso funcione, acredito que você precisaria escrever seu próprio servidor HTTP, isso faz isso especificamente, pois você não pode ter 250 processos de PHP em memória. Talvez o LightTPD possa ser usado dessa maneira de alguma forma com esse mod de cache Lua. Não sei. Seria interessante embora. Inferno, eu tenho que tentar algum dia :)

Outras dicas

Claro que existe, mas acho que não será muito eficiente com muitos usuários. Você pode fazer a pesquisa onde cada cliente faz o servidor para ver se há novas mensagens ou você pode usar o Técnica do cometa em que o servidor pode empurrar novas mensagens para os clientes - verifique o Plugin cometa para xajax. Como isso seria implementado usando Xajax e PHP está além de mim, mas eis como eu tentaria implementá -lo.

Deixe cada cliente se conectar ao servidor (login etc), então:

  1. Para cada mensagem enviada por um cliente (remetente), atualize a fila de mensagens para o cliente (receptor)
  2. Deixe o Client Poll Server para novas mensagens na fila / empurre as novas mensagens via Comet.
  3. Atualize a GUI se houver novas mensagens.
  4. Enxaguar, ensaboar, repetir

Usar um servidor IM TRUE como o Ejabberd pode percorrer um longo caminho, ser mais eficiente e permitir que seus usuários se conectem através de clientes de desktop (se é isso que você deseja). Eu provavelmente usaria isso como back -end, Iow Ejabberd seria o servidor e o PHP seria o cliente usando XMPP em PHP, e atuar como um proxy para o webgui.

Veja também:
Google TechTalk no recurso de bate -papo do Gmail (e problemas de escalabilidade)

Esse é o meu $ 0,02

Enquanto não houver tecnologia push http, você nunca terá um bate -papo em tempo real apenas usando JavaScript.

Possíveis WorkArrounds:

  • use um Flash Filme ou a Java Applet para executar uma comunicação de soquete
  • Mantenha solicitações de pesquisa de volta ao lado do servidor por alguns segundos

Você pode usar o WebSockets, mas sendo um novo recurso HTML5, é meio limitado. Para sua sorte, existe Socksjs, que implementa WebSockets nos navegadores que não lidam com isso.

No lado da hospedagem, você poderá usar qualquer servidor Websockets, há alguns para PHP.

Se você deseja implementar um servidor de bate -papo escrito com um idioma de script, como PHP/JSP, a técnica de conexão HTTP pendurada deverá ser marcada na sua lista de opções. O motivo é que a maioria dos cortes na web (anfitriões especialmente compartilhados) não gosta de muitas conexões penduradas.

Você pode encontrar tudo o que precisa para implementar um cliente da Web e servidor de bate -papo PHP neste "Protocolo de servidor de bate -papo otimizado para linguagens de script lateral do servidor" publicação.

A melhor estratégia que eu vi é fazer uma solicitação de Ajax para mensagens e, em seguida, reiniciar exatamente a mesma solicitação assim que terminar.

No lado do servidor, faça o script "StaL" por 60 segundos ou até que uma nova mensagem seja recebida. Isso mantém a mesma conexão aberta por um máximo de 60 segundos, mas quando uma nova mensagem é recebida, ela a produz e para imediatamente, solicitando o Ajax do lado do cliente a abrir outra conexão.

Isso fornece notificação quase instantânea de novas mensagens e também é muito mais fácil para o servidor do que fazer uma nova conexão a cada x segundos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top