Como tornar uma sala de chat javascript/php mais eficiente em termos de tempo de carregamento e comunicação sql

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

Pergunta

No momento, a configuração do meu chat javascript funciona, então é como

function getNewMessage()
{
     //code would go here to get new messages
     getNewMessages();
}
getNewMessages();

E dentro da função, eu usaria o jQuery para fazer uma postagem para recuperar as mensagens de um scrip php que 1.Inicie a conexão SQL 2.Validar que é um usuário legítimo através do SQL 3.Recupere apenas uma nova mensagem desde o último usuário visite 4.fechar SQL

Isso funciona muito bem e o chat funciona perfeitamente.Minha preocupação é que isso esteja abrindo e fechando MUITAS conexões SQL.É muito rápido, mas eu gostaria de fazer um pequeno jogo multijogador javascript agora, e transferir as coordenadas do usuário, bem como dezenas de outras variáveis, 3 vezes por segundo, em que estou abrindo e fechando a conexão sql a cada vez e extraindo informações de várias tabelas de cada vez pode não ser eficiente o suficiente para funcionar sem problemas e também pode sobrecarregar o servidor.

Existe alguma maneira melhor e mais eficiente de comunicar todas essas variáveis ​​​​que eu deveria saber e que não seja tão difícil no meu servidor/banco de dados?

Foi útil?

Solução

Não use conexões persistentes, a menos que seja a única solução disponível para você!

Quando o MySQL detecta que a conexão foi interrompida, todas as tabelas temporárias são descartadas, qualquer transação ativa é revertida e todas as tabelas bloqueadas são desbloqueadas.Conexões persistentes só caem quando o filho do Apache sai, não quando o seu script termina, mesmo se o script travar!Você poderia herdar uma conexão no meio de uma transação.Pior ainda, outras solicitações podem ser bloqueadas, aguardando o desbloqueio dessas mesas, o que pode levar muito tempo.

A menos que você tenha mediu quanto tempo leva para conectar e identificou isso como uma porcentagem muito grande do tempo de execução do seu script, você não deve considerar o uso de conexões persistentes.Na verdade, deve ser isso que você faz aqui, se estiver preocupado com o desempenho.Confira xhprof ou xdebug, crie um perfil do seu código e comece a otimizar.

Outras dicas

Talvez tente usar uma abordagem diferente para obter as novas mensagens do servidor: Cometa.

Usando esta técnica você não precisa abrir tantas conexões novas.

Algumas dezenas de players ao mesmo tempo não prejudicarão o banco de dados nem causarão atraso perceptível se você tiver instruções SQL eficientes.Provavelmente seu banco de dados estará hospedado no mesmo servidor ou pelo menos na mesma rede do seu jogo ou site, então não se preocupe.Se o seu banco de dados estiver hospedado em um servidor separado executando uma placa 16mz de 8 bits carregada com MSDOS, localizada na remota Amazon, conectada por ondas de rádio conectadas a um gerador movido a manivela operado por um macaco bêbado, você está no seu próprio com este.

Caso contrário, você deveria estar mais preocupado com a quantidade exata de dados que está passando para seus jogadores.Se você estiver passando coordenadas para todos os objetos em um mundo inteiro, o carregamento da página poderá demorar muito, mesmo que a consulta ao banco de dados demore uma fração de segundo.Isso às vezes é superado nos jogos por um recurso de "névoa de guerra" que não se preocupa em notificar o usuário sobre cada objeto em todo o mapa, apenas aqueles que estão ao alcance imediato do jogador.Isso pode ser feito facilmente com uma única consulta SQL onde as coordenadas do objeto estão próximas de um jogador.Porém, se você tiver um host mesquinho, ele se preocupará com o número de conexões e consultas.

Se você está preocupado em atrair ainda mais jogadores do que isso, considere explorar métodos de cache, como pré-construir arquivos curtos que armazenam registros ou valores comumente buscados usando fopen(), fgets(), fclose(), etc.Ou use extensões php como apc para armazenar valores na memória que persistem de carregamento de página a carregamento de página. memcache ou memcached também agem de forma semelhante, mas de uma forma que funciona como um servidor separado ao qual você pode se conectar, armazenar valores que podem ser compartilhados com outros acessos de página e consultar.

Para atualizar páginas ou valores armazenados em cache quando você achar que eles podem ficar obsoletos, você pode executar um cron job de vez em quando para atualizar esses arquivos ou valores.Se o seu host não permitir cron jobs, considere fazer com que seus convidados façam esse trabalho braçal:uma linha de script em uma determinada página atualizará o cache com novos valores de uma consulta ao banco de dados após um certo número de acessos à página.Ou armazene em cache um valor de data para verificar em cada acesso à página e, se muito tempo tiver passado, atualize o cache.

Novamente, a menos que você esteja sob o domínio opressivo de um host mesquinho, ou a menos que esteja recebendo cem ou mais acessos de página por vez, não há necessidade de se preocupar com seu banco de dados.Os bancos de dados não são tão frágeis.Se eles caíssem em um ataque histérico de lágrimas a qualquer momento que mais de uma pergunta aparecesse, os engenheiros que o fizeram não teriam emprego por muito tempo.

Eu sei que esta é uma "resposta" bastante chata, mas talvez você devesse pensar nisso de uma maneira diferente, afinal esse não é realmente o uso mais forte de um banco de dados relacional.Você já considerou uma solução XMPP?Na IMO, esta seria a melhor ferramenta para o trabalho e tanto o ejabberd quanto o openfire são triviais de configurar atualmente.A excelente biblioteca Strophe pode facilitar a história do front-end e, como um bônus adicional, você obtém ligação HTTP (como commet), para que não precise pesquisar o servidor, sua latência diminuirá e você gerará menos tráfego HTTP .

Eu sei que é altamente improvável que você mude toda a sua abordagem só porque eu disse isso, mas queria fornecer uma perspectiva alternativa.

http://www.ejabberd.im/ http://code.stanziq.com/strophe/

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