micox 2 Denunciar post Postado Janeiro 18, 2012 A dúvida que não quer calar após tanta discussão sobre long polling: dá pra fazer com PHP ou não dá? Temos que lembrar que muita gente, principalmente iniciantes ou pessoas com sites pequenos, usam hospedagem contratada e NÃO TEM liberdade de instalarem outro tipo de servidor Web (sem pagarem a mair por isso). Segundo link passado pelo Matheus Tavares, dá: http://code.google.com/p/chatildis/source/browse/trunk/chat.php?r=7 Em resumo, após as explicações, eu faria: obs1 - Nada foi testado obs2 - gostaria por favor que melhorassem/corrigissem possíveis erros (erros de desempenho, lógica e entendimento também afinal acho que ainda não entendi direito) No servidor PHP/lado server (seco, sem implementar threads nem nada): <?php //o script abaixo, ficará tentando (por 120 segs) encontrar um //novo jogador no banco de dados, na tabela/linha específica ao jogo atual //se conseguir, retorna o código do novo jogador //se não conseguir retorna um texto de erro //só executo a rotina se foi passado o parametro indicando o id do jogo atual if(!empty($_GET['jogoatual']) && is_numeric($_GET['jogoatual'])){ //aumento o timeout e o keep-alive timeout $timeout = 120; set_time_limit ( $timeout); //segundo uma pesquisa rápida também tenho que configurar o keepAlive no apache, certo ou errado? //http://httpd.apache.org/docs/1.3/keepalive.html header("Connection: Keep-alive"); header("Keep-Alive timeout=".$timeout); //não quero cache disso. header('Cache-Control: no-cache, must-revalidate'); function microtime_float(){ //pegando os segundos atuais list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $time_start = microtime_float(); $time_atual = microtime_float(); //while que roda enquanto não estourar o timeout ou chegar no exit() de dentro while( $time_atual - $time_start < $timeout){ //consultando se tem novos jogadores na tabela do bd referente ao jogo atual $novousercode = consulta_novo_user((int)$_GET['jogoatual']); if($novousercode){ //se tem novo user, retorno seu código echo $novousercode; exit(); }else{ //senão, aguardo um pouco antes de rodar no while novamente sleep(10); $time_atual = microtime_float(); } }//end while time_atual //se deu o timeout e saiu do while, então naõ achou nenhum jogador novo echo "Sem novo jogador. Timeout de $timeout segs excedido"; } ?> No browser/lado client (usando jquery pra simplificar): var novo_jogador_id, status_game = 'Aguardando outro jogador se conectar'; function busca_novo_jogador(){ $.ajax('http://servidor.com/jogadorconectado.php?jogotual=123',{ timeout: 120, //tempo pra esperar outros jogadores (1 minuto) cache: false, success: function(data){ //função a ser chamada quando chegar algo if(!isNaN(data)){ //se o servidor mandou um número é o id do outro jogador status_game = 'O jogador número ' + data + ' está conectado'; novo_jogador_id = data; }else{ //servidor mandou qualquer coisa que não é número. deve ter dado erro por lá status_game = 'O servidor não conseguiu enviar um jogador novo - ' + data; quer_tentar_de_novo(status_game); } }, error: function(jqXHR, textStatus, errorThrown){ //função a ser chamada em caso do servidor não retornar algo bom if(errorThrown=='timeout'){ status_game = 'O tempo de 1 minuto passou e nenhum outro jogador quis entrar'; }else{ status_game = 'O servidor não conseguiu enviar outro jogador - ' + errorThrown; } quer_tentar_de_novo(status_game); } }); } function quer_tentar_de_novo(mensagem){ var vai = confirm(mensagem + '\r\n\r\n Deseja tentar aguardar outro jogador novamente?'); if(vai){ busca_novo_jogador(); } } Compartilhar este post Link para o post Compartilhar em outros sites
visitante_php 0 Denunciar post Postado Janeiro 19, 2012 este script do micox me lembrou este site http://www.cex.org.br/ veja o jogar online... Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Janeiro 19, 2012 Micox, é claro que dá... inclusive eu postei o exemplo no tópico da sua dúvida... um chat prontinho em PHP / JS puros. Só mudar os dados de acesso ao bd e executar.... Compartilhar este post Link para o post Compartilhar em outros sites