Existe uma alternativa de ajax que não requer votação sem modificações lado do servidor?

StackOverflow https://stackoverflow.com/questions/427861

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando criar um pequeno e básico "ajax" jogo multiplayer baseado. Coordenadas de objetos estão sendo dadas por um PHP "manipulador". Este arquivo handler.php está sendo sondados cada 200MS, usando ajax.

Uma vez que não há necessidade de pesquisa em que nada acontece, eu me pergunto, há algo que poderia fazer a mesma coisa sem polling frequentes? Por exemplo. Comet, embora eu ouvi que você precisa para aplicações do lado do servidor configurar para Comet. É um servidor compartilhado, então eu não posso fazer isso.

Talvez impedir que o arquivo handler.php até mesmo retornar uma resposta, se nada tem que ser mudado no cliente, isso é possível? Em seguida, novamente você ainda tem o cliente inutilmente pedindo uma resposta, mesmo que algo não mudou ainda. Basicamente, ele só deve usar largura de banda e separarão os recursos se precisa de algo para ser dito para o cliente, por exemplo. a mudança de coordenadas de um objeto.

Foi útil?

Solução

Aqui está uma solução - usar um provedor de SaaS cometa, como WebSync On-Demand . Não há recursos do servidor para se preocupar, hospedagem compartilhada ou não, uma vez que tudo é descarregado, e você pode empurrar para fora a informação, conforme necessário.

Uma vez que é SaaS, ele vai trabalhar com qualquer linguagem de servidor. Para PHP, há já uma editora escrito e pronto para ir.

Outras dicas

Comet é geralmente usado para este tipo de coisa, e isso pode ser uma configuração frágil, pois não é uma tecnologia particularmente comum para que possa ser fácil não "acertar". Dito isto, há mais recursos disponíveis agora do que quando eu última tentou fazê-lo ~ 2 anos.

Eu não acho que você pode fazer o que você está pensando e ter handler.php simplesmente não retornar execução nada e parada: o servidor web irá manter a conexão aberta e evitar mais de sondagem até handler.php faz algo (termina ou fornece saída). Quando isso acontecer, você ainda está lidando com uma resposta.

Você pode tentar uma técnica de sondagem longa, onde o AJAX permite que um grande tempo de espera (por exemplo, 30 segundos), e handler.php gira sem responder até que ele tem algo a relatar, em seguida, retorna. (Você vai querer certificar-se da fiação não é intensivo de recursos). Se handler.php "expira" e nada acontece, tem que sair e deixar AJAX sondagem novamente. Uma vez que só acontece a cada 30 segundos, será uma grande melhoria sobre ~ 5 vezes por segundo. Que iria manter o seu polling a um mínimo.

Mas esse é o tipo de coisa Comet é projetado para.

Como Ajax só lhe oferece um modelo cliente-servidor pedido (tração normalmente designado, em vez de push), a única maneira de obter dados do servidor é através de solicitações. No entanto, uma técnica comum para contornar este problema é para que o servidor só respondem quando tem novos dados. Assim, o cliente faz uma solicitação, os trava do servidor em que esse pedido até que algo acontece e então responde. Isso fica em torno da necessidade de polling frequentes mesmo quando os dados não mudou como você só precisa do cliente enviar um novo pedido depois que ele obtém uma resposta.

Uma vez que você estiver usando PHP, um método simples poderia ser a de ter o código PHP chamar o comando de sono para 200ms em um tempo entre as verificações para alterações de dados e, em seguida, retornar os dados para o cliente quando ele faz a mudança.

EDIT: Eu também recomendo ter um tempo limite sobre o pedido. Então, se não acontecer nada para dizer 2 segundos, a mensagem "nenhuma mudança" é enviado de volta. Dessa forma, o cliente sabe o servidor ainda está vivo e processamento de seu pedido.

Uma vez que este é marcado “html5”: HTML5 tem <eventsource> e WebSocket , mas a implementação lado ainda está no tempo futuro na prática.

Opera implementada uma versão antiga do <eventsource> chamado <event-source>.

O servidor deve participar neste. Verifique com o provedor de hospedagem que estão disponíveis módulos. Ou tentar convencê-los a apoiar Comet.

Talvez você deve considerar uma pequena Virtual Private Server (VPS) para isso.

Uma coisa a acrescentar sobre as sugestões de votação longas: Se você estiver em um servidor compartilhado, esta solução terá escalabilidade limitada, já que cada sondagem longa ativa irá manter uma conexão (e um processo de servidor de um lado para o serviço que conexão) ativo. O seu provedor provavelmente tem limites (um ou de facto definida por política) sobre o número de conexões que você pode ter aberto ao mesmo tempo, então você vai bater em uma parede, se você tem mais sessões / windows do que jogar ao mesmo tempo.

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