Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Hilkias

carregar duas paginas no PHP

Recommended Posts

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.