Ir para conteúdo

POWERED BY:

Arquivado

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

Raffael Chacon

[Resolvido] Atualização Automática

Recommended Posts

Bom dia pessoal; a um tempo atráz eu vim até aqui com uma duvida. Eu tinha um banco e puxando informações desse banco eu queria forma um gráfico. Até ai tudo beleza, sendo que quando eu atualizava esse banco o grafico só atualizava se eu fechasse e abrisse a pagina novamente. Me passaram a função setInterval e cehguei a esse codigo:

var tempo:Number = setInterval(intervalo, 1000); //1 segundo em milisegundos de intervalo 
var i:Number; 
function intervalo(){
//Pega o Numero do Frame Corrente
var cont:Number = _currentframe;
//txtnumero.text = cont;
//Cria Variável para Receber o XML
var dados:XML = new XML();
//Recebe os Dados do Puxadados.php
dados.load( "/riosdor/grafico/puxadados/emergencia/tempoverde.php?cacheKill="+Math.random()*999 );
	dados.onLoad = function( success ){   
				if ( success ){
			var valor = this.firstChild.firstChild.nodeValue;
			coluna = (valor/720) + 1;
			coluna = Math.ceil(coluna);
			gotoAndStop(coluna);
			if (valor < 3600){
				valor = valor / 60;
				txt1.text = valor+"'";
			}
			else{
				hora = valor / 3600;
				hora = Math.floor(hora);
				temp = hora * 3600;
				valor = valor - temp;
				min = valor / 60;
				min = Math.floor(min);
				temp = min * 60;
				valor = valor - temp;
				seg = valor;
				txt1.text = hora+"° "+min+"'";
			}
		}
		else {      
		trace( "Não foi possível carregar o conteúdo" );   
	}
}
}
Sendo que agora, postando vários gráficos cada um com várias colunas ele está dando pau no meu banco, eu creio que seja por culpa dessa atualização de 1 em 1 segundo. Tentei mudar pra por para mais tempo mas não funcionou, eu queria por algo como 1 minuto. Alguém sabe como, ou outra funlção que possa me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 minuto igual 60000 milisegundos

Fazer várias requisições seguidas a um banco de dados pode vir a derrubar seu SERVIDOR

 

Sugiro que você salve os dados desse banco em um XML e só atualize o XML com os dados quando houver alterações no banco... criando uma rotina para isso.

 

E ai o flash só acessa o XML.

 

Lembre-se que você é 1 pessoa que vai estar atualizando os dados do banco... em 1 computador

Se for um site que tem milhões de acessos por dia... ou alguns mil já é suficiente para derrubar um servidor dependendo do numero de requisições feitas a ele.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que seja mais ou menos isso que fiz, no exemplo que sitei é gerado o XML: <dado>"valor"<dado>

Então o flash não está fazendo o busca no banco? Mas por que então meu sql travou quando pus um grafico puchando 11 informações além de uns outros que pucham 1 ou 2?

Segue o código que gera o XML:

(Se tiver algo que tenha que por para o XML só fazer busca no banco quando o banco for atualizado, por favor post)

<?php
$conn = mysql_connect("localhost", "root", "") or die("Impossivel conectar");
	//caso a conexão seja estabelecida corretamente seleciona o banco de dados a ser usado
	if($conn)
	{
		mysql_select_db("bd_usuarios", $conn);
		//selecionando dados da tabela 
		$sql = "SELECT MAX(ID) FROM tempoatende";
		//Coloca os dados em um Query
		$query = mysql_query($sql); 
		$maxid = "";
		while($sql = mysql_fetch_array($query)){ 
			//Atribui Os valores dos Campos as Variáveis
			$maxid = $sql["MAX(ID)"];
			break;
		}
		$sql = "SELECT * FROM tempoatende WHERE id='$maxid'";
		$query = mysql_query($sql);
		while($sql = mysql_fetch_array($query)){ 
			//Atribui Os valores dos Campos as Variáveis
			$d1 = $sql["d1verde"];
			$d2 = $sql["d2verde"];
			break;
		}


		$d1 = explode(":",$d1);	
		$d1[0] = $d1[0] * 3600;
		$d1[1] = $d1[1] * 60;
		$d1total = $d1[0] + $d1[1];// + $d1[2];

		$d2 = explode(":",$d2);
		$d2[0] = $d2[0] * 3600;
		$d2[1] = $d2[1] * 60;
		$d2total = $d2[0] + $d2[1];// + $d2[2];

		$dt = $d2total - $d1total;


		$dado = ($dt);
		$_SESSION['dado'] = $dado;
		//Pega o Valor de "dado" e joga para onde o Flash possa pegar
		header( "Content-type: text/xml; chatset=UTF-8" );
		printf("<dado>$dado</dado>");
		die;
	}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso ai não é um XML

Isso ai é um arquivo php que faz requisições ao SQL que tem a cara de um XML

 

O que você tem que fazer é listar os dados e usar um fopen ou file e salvar esse XML

 

Ou até mesmo usar um domXML só para editar ... adicionar etc

 

Se você usar da maneira que está usando vai sim derrubar o servidor... com varias requisições como eu já disse.

 

Para derrubar um server pequeno bastam 60 requisições simultaneas, que o load do server chega a 100 dependendo do que você está requisitando.

 

Então SALVE esse seu XML... e faça o flash ler aquele XML salvo

 

E a cada atualização que for feita do banco você coloca um código para chamar um arquivo que vai recriar esse XML

Ou simplesmente atualizar o XML

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum...então eu salvaria esse resultado ("<dado>"RESULTADO"<dado>") em outro arquivo

então substituiria essa parte do comando:

header( "Content-type: text/xml; chatset=UTF-8" ); 
                       printf("<dado>$dado</dado>"); 
                       die; 

Por um comando que iria criar um xml com essas informações, é isso?

Como eu faria isso?

No flash utilizaria o mesmo comando de antes, o load?

 

Muito obrigado pela ajuda "berseck"!

Compartilhar este post


Link para o post
Compartilhar em outros sites

No flash você continua usando o comando de load só que com o caminho para o arquivo XML

 

E ai você usa um fopen

while
$arquivo = "conteudo.xml";
$fp = fopen($arquivo, "w");
fwrite($fp, "<?xml version='1.0' encoding='utf-8'?>");
fwrite($fp, "<dado>$dado</dado>");
fclose($fp);

Ai o conteudo.xml é onde você vai colocar o arquivo... se quiser pode colocar um caminho para uma pasta ali até o arquivo xml

isso ai é um exemplo bem basico

 

Aconselho você procurar sobre dom Element

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui!!!!Funcinou perfeitamente...agora aproveitando, para mim por mais de um dado no XML como faria? Tentei quando usava a outra forma e não consegui. Tipo tendo duas variáveis $dado1 e $dado2 quando tendo algo do tipo:

fwrite($fp, "<dado>$dado</dado>");
fwrite($fp, "<dado2>$dado2</dado2>");
Não vai...como seria então?

 

 

Muito obrigado mesmo!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom mais um dado é exatamente como você fez

 

Só que ai eu mudaria a forma

Faria algo do tipo

 

$nodes .= "<dados>".$dados."</dados>\n";

 

E colocaria para fazer um loop para popular esses dados

Ai você salva tudo de uma vez só os nodes

Assim:

fwrite($fp, $nodes);

 

Melhor maneira de fazer isso é com um for... ou outras maneiras de popular como while etc

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que não entendi, naverdade creio que seja bem simples, mas não sei o que precia por pra funcionar correntamente. Eu preciso exibir o conteúdo de 3 variáveis. $verde, $vermelho e $azul. Eu criei 3 PHP para gerar 3 XML. Queria saber se posso usar apenas 1 php e 1 xml.

quando ponho:

fwrite($fp, "<dado>$verde</dado>");
fwrite($fp, "<dad2>$amarelo</dado2>");
Ele me dá o erro:

Em um documento XML só são permitidos elementos de nível superior. Erro ao processar o recurso 'http://localhost/riosdor/gr...

<?xml version='1.0' encoding='utf-8'?><dado>10</dado><dado2>0</dado2>

-------------------------...

 

Ele exibe o resultado, mas não corretamente!

Ja tentei de várias formas, mas não achei a correta!!!!

Tem como fazer isso? por que pelo que eu entendi da forma que você descreveu eu vou gerar 3 XML, usando um for para isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque XML é feito assim:

<data>
 <dados></dados>
</data>

Eu expliquei de uma maneira simples...

 

e o que você ta tentando fazer seria algo assim

<dados> info </dados>

Isso realmente não pode ser feito!!

 

Então vamos lá explicar melhor:

 $arquivo = "fotos.xml";
 $fp= fopen($arquivo, "w");
 fwrite($fp, "<?xml version='1.0' encoding='utf-8'?>");
 fwrite($fp, "<dados>");
 $conteudo .= "<coluna>".$vermelho."</coluna>";
 $conteudo .= "<coluna>".$verde."</coluna>";
 $conteudo .= "<coluna>".$azul."</coluna>";
 fwrite($fp, $conteudo);
 fwrite($fp, "</album>");
 fclose($fp);

Entendeu?

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simmm entendi sim...consegui gerar o xml, agora no flash, eu uso essa linha pra pegar o conteudo:

var dado:XML = new XML();
//Recebe os Dados do Puxadados.php
dado.load( "/riosdor/grafico/puxadados/emergencia/entnosologicas/conteudo.xml?cacheKill="+Math.random()*999 );
	dado.onLoad = function( success ){   
				if ( success ){
			var valor = this.firstChild.firstChild.nodeValue;
O que mudaria nela? Se eu quero pegar o conteudo da variável $verde, a primeira a ser postado no xml.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, no caso, agora não precisa mais de passar parâmetros para seu xml.

E o acesso aos nós do xml continua da mesma forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora você vai acessar os nós de acordo como você criou ;)

 

Se o terceiro nó é o verde então vai ficar algo como

xml.firstChild.childNodes[2].childNodes;

 

Esse deve ser o valor do 3 nó

 

Ai se da uma estudada em como funciona XML :P que você faz isso facim

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Foi...tudo funcionando!!!!!

então vamos aos códigos finais:

Gerar XML:

$conteudo = "";
				$arquivo = "conteudo.xml"; 
				$fp = fopen($arquivo, "w"); 
				fwrite($fp, "<?xml version='1.0' encoding='utf-8'?>"); 
				fwrite($fp, "<dado>");
					$conteudo .= "<coluna>".$d1."</coluna>"; 
					$conteudo .= "<coluna>".$d2."</coluna>"; 
					$conteudo .= "<coluna>".$d3."</coluna>"; 
					fwrite($fp, $conteudo); 
				fwrite($fp, "</dado>"); 
				fclose($fp);
Pegar conteudo no Flash:

dado.load( "/riosdor/grafico/puxadados/emergencia/entnosologicas/conteudo.xml?cacheKill="+Math.random()*999 );
	dado.onLoad = function( success ){   
				if ( success ){
			var valor = this.firstChild.childNodes[0].firstChild.nodeValue;

 

 

 

Muio obrigado pela ajuda!!!

 

Resolvido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se posso reabilitar o tópico pois tive um problema em atualizações novamente. Se puder, segue:

Com a ajuda do "berseck" eu conseguei sanar um problema que estava tendo com o banco pois muitas consultas estavam travando meu banco. Agora que está tudo beleza eu passei para o flash. Tenho graficos em uma pagina php que possui um form que atualiza os dados no banco e esses graficos em flash leêm xml para pegar os dados do banco, tudo está fluindo bem, no flash para que o grafico se atualize eu estou fazendo assim:

var tempo:Number = setInterval(intervalo, 1000); //1 segundo em milisegundos de intervalo 
var i:Number; 
function intervalo(){
//Pega o Numero do Frame Corrente
var cont:Number = _currentframe;
//Cria Variável para Receber o XML
var dado:XML = new XML();
//Recebe os Dados do Puxadados.php
dado.load( "/riosdor/grafico/puxadados/emergencia/entnosologicas/d1teste.php?cacheKill="+Math.random()*999 );
Tudo estava indo bem até que eu pus vários gráfico em uma só pagina. Isso deixou a pagina super lenta, tenho nesse pagina 6 graficos, sendo que 2 deles pucham mais de uma informação do xml, um inclusive pucha 11 informações. Creio que seja por culpa dessa atualização constante. Então resolvi por assim:

onEnterFrame = function(){
//Pega o Numero do Frame Corrente
var cont:Number = _currentframe;
//txtnumero.text = cont;
//Cria Variável para Receber o XML
var dado:XML = new XML();
//Recebe os Dados do Puxadados.php
dado.load( "/riosdor/grafico/puxadados/emergencia/xml/mortalidade.xml");
Funciona mas o gráfico só atualiza se eu fechar e abrir a pagina novamente.

Alguem sabe como posso fazer essa atualização sem que a pagina fique lenta? Ou não vou poder ter mais de um gráfico por pagina?

 

Se não puder reabilitar o topico peço desculpas!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode colocar uma rotina de 1 em 1 minuto para atualizar os gráficos...

 

Como você já havia dito... re carregando o xml propriamente dito assim você vai ter algo atualizado.

 

Mas se for para fazer graficos simples faça um sisteminha que atualize em hora cheia ou meia hora... assim n sobrecarrega tudo

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode colocar uma rotina de 1 em 1 minuto para atualizar os gráficos...

 

Como você já havia dito... re carregando o xml propriamente dito assim você vai ter algo atualizado.

 

Mas se for para fazer graficos simples faça um sisteminha que atualize em hora cheia ou meia hora... assim n sobrecarrega tudo

 

Abraços

 

É assim, naverdade só preciso que eles se atualizem quando a pagina for atualizada. O gráfico é velocimetro, quando a pagina for atualizada quero que o ponteiro vá mechendo ai quando chegar no lugar certo pare. O problema é que o gráfico só é atualizado quando se fecha e abre a pagina novamente. Pq se eles fossem atualizados quando a pagina fosse atuazalida eu colocava uma rotina de atualização na pagina. É até melhor pq posso escolher as que vão ser atualizadas constantemente e as que não vão ser...

Obs.: O codigo que pega o XML fica dentro de um Symbol!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom ai o que você ta querendo fazer é um velocimetro tipo da net...

 

Que mede a velocidade da sua net e vai mudando de posição, aquele código foi criado com php e com um onEnterFrame no flash, para que ele pudesse pegar dados vindo do php na mesma velocidade que eles vem....

 

Pois ele faz um teste de ping da pessoa etc... não é algo assim tão simples... que de para jogar dados a um banco de dados... e depois refletir em um XML e ficar fazendo esse tipo de transação.

 

Poder fazer isso você pode... mas pode deixar seu servidor ruim pelo que já mencionei antes.

De uma estudada em domXML e faça atualização de nós do XML dinamicamente conforme os dados forem sendo recebidos pelo php...

 

Essas são algumas opçãos como não sei qual é seu intuito desse velocimetro fica complicado.

Mas esse seu projeto já ta rodando mais com cara de php do que de flash... ai sugiro que você comece a pesquisar na parte de PHP para maiores informações.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

O resumo do projeto é o seguinte:

Eu quero construir indicadores, vou usar um indicador como exemplo, o de mortalidade. Esse indicador possui uma tabela no banco de dados com 2 campos principais, "Numero de Altas" e "Numero de Óbitos". Agora depois da modificação, colocando xml ficou assim: Eu tenho uma pagina PHP que pega os dados das duas colunas tira a porcentagem e atualiza o XML. Essa pagina é rodada toda vez que eu atualizo o banco. No meu index tem o grafico "Mortalidade" e ao lado dele um botão que joga para uma outra pagina onde se entra com dados para atualizar o banco. Depois disso ele carrega o index novamente com o comando "header"(com o xml já atualizado). Mas o flash não pucha o xml novo. Eu estava usando isso para pegar o dados do XML:

onEnterFrame = function(){
//Pega o Numero do Frame Corrente
var cont:Number = _currentframe;
//txtnumero.text = cont;
//Cria Variável para Receber o XML
var dados:XML = new XML();
//Recebe os Dados do Puxadados.php
dados.load( "/riosdor/grafico/puxadados/emergencia/mortalidade.php" );
	dados.onLoad = function( success ){   
		if ( success ){
Mas o flash so carrega novamente o XML depois que eu fecho e abro a pagina. Já tentei usar o "setInterval" como você viu, funcionou mas deixou minha pagina lenta pois era várias entradas. Não teria como, pelo PHP eu mandar um refresh nos graficos?

Naverdade o velocimetro é só um template mesmo.

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.